使用foreach数据绑定和输入值数据绑定来解决IE8问题

时间:2012-02-02 17:48:02

标签: internet-explorer input foreach knockout.js

我正在使用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>

2 个答案:

答案 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上可用。