我正在使用knockoutjs 2.0 我一直试图让这个表在IE8中工作(它在FF,Chrome和IE9中工作正常):
<table data-bind="foreach: Applications">
<tr>
<td><input type="text" data-bind="value: Name"/></td>
</tr>
</table>
在IE8中我收到错误: 错误:'undefined'为null或不是对象 网址:http://127.0.0.1:81/Scripts/jquery-1.5.1.min.js
我实际上通过使表格成为模板并使模板包含表格行来解决问题。但这不是那么干净,我想知道是否有更好的解决方案。
以下是我设置视图模型的方法:
self.Applications = ko.observableArray([]);
$.each(model.Applications, function (i, applicationItem) {
var application = new Application(applicationItem.ApplicationID, applicationItem.Name);
self.Applications.push(application);
});
function Application(applicationID, name) {
var self = this;
self.ApplicationID = applicationID
self.Name = ko.observable(name);
};
编辑:找到解决方案 改为使用无容器控制流程
<table>
<tbody>
<!-- ko foreach: Applications -->
<tr>
<td><input type="text" data-bind="value: Name"/></td>
</tr>
<!-- /ko -->
</tbody>
</table>
答案 0 :(得分:6)
你的修复工作正常,如果你想要一个不那么详细的选项,你可以简单地将数据绑定放在“tbody”节点上:
<table>
<tbody data-bind="foreach: Applications">
<tr>
<td><input type="text" data-bind="value: Name"/></td>
</tr>
</tbody>
</table>
问题是ie8会自动向DOM添加“tbody”(即使标记中没有)。所以,如果data-bind属性在“table”节点上,当knockout执行foreach时,新的子节点将被添加到“table”而不是“tbody”,从而获得如下内容:
<table data-bind="foreach: Applications">
<tr>
<td><input type="text" value="John"/></td>
</tr>
<tbody>
</tbody>
</table>
IE并不高兴。这就是为什么,正如你肯定发现的那样,只使用“无容器”符号是不够的,你需要“tbody”节点。请注意,其他浏览器处理此问题没有问题。 这是使用knockoutjs时“必须知道”的技巧之一。
希望这有助于确定正在发生的事情。
答案 1 :(得分:0)
我会说你应该使用$ data.Name而不仅仅是Name。 否则,淘汰赛期望Name在ViewModel / $ root上可用。