ie8下使用knockoutjs遇到的一个模板异常
2014-12-15 13:40 FuzhePan 阅读(1208) 评论(0) 编辑 收藏 举报ViewModel中有一个数组,代码大概如下:
function ReportViewModel(){ var self = this; self.extendedProperties = ko.observableArray([]); ... }
在从服务端获取到数据之后,使用下面的代码更新模型:
for (var index in json.extendProperties) { reportViewModel.extendedProperties.push(extendProperties[index]); }
knockout会根据extendedProperties使用我定义好的模板生成html,模板代码及绑定代码大概如下:
<script type="text/html" id="template-report-extendproperty"> <p class="the-week"><b data-bind="text:name"></b></p> ...... </script> <!--使用汇报模板--> <div class="write-report clearfix" data-bind="template: { name: 'template-report-extendproperty', afterRender: extendedPropertyRendered,foreach: extendedProperties }"> </div>
上述代码在ie9及以上,chrome下运行良好。但在ie8下会提示“name为undefined”。
刚开始怀疑是ko在ie8下的bug,翻了下文档没有特殊说明,谷歌也没找到类似的问题。
然后怀疑是不是在往reportViewModel.extendedProperties里面push数据的时候,出现了一些脏数据。问了验证这个问题,把更新ViewModel的代码修改如下:
for (var index in json.extendProperties) { var extendProperty = json.extendProperties[index]; consjole.log(index); console.log(extendProperty); createReportViewModel.extendedProperties.push(new ExtendProperty(extendProperty)); }
于是在控制台得到如下输出:

奶奶的,遍历完数组之后,把Array的prototype中的indexOf也给遍历出来了。看来是for in语法在ie8下不大好使,还是老实用$.each吧。更新ViewModel的代码最终修改如下:
$.each(json.extendProperties, function(i, n) { reportViewModel.extendedProperties.push(new ExtendProperty(n)); });
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?