我不明白为什么这些淘汰表绑定无法正常工作:

Javascript:

$(function () {

    var FileObject = function(id, name) {
        this.id = id;
        this.name = name;
    };

    var FilesModel = function() {

        this.filesSelected = ko.observable(false);
        this.myFiles = ko.observableArray([new FileObject(1, 'test_1')]);
        this.myFiles.push(new FileObject(2, 'test_2'));
    };

    var filesModel = new FilesModel();
    window.filesModel = filesModel;
    ko.applyBindings(filesModel);

    filesModel.myFiles().push(new FileObject(3, 'test_3')); // This never shows

    alert(filesModel.myFiles().length); // Shows 3 items

});


HTML:

<h3>TABLE 1</h3>
<table>
<tbody data-bind="foreach: myFiles">
    <tr>
        <td>FILE:</td>
        <td data-bind="text: name"></td>
    </tr>
</tbody>
</table>

<h3>TABLE 2</h3>
<table>
<tbody data-bind="foreach: myFiles()">
    <tr>
        <td>FILE:</td>
        <td data-bind="text: name"></td>
    </tr>
</tbody>
</table>


在这两个表中,将显示前两个文件,但不显示第三个文件。我想念什么?

最佳答案

你真的很亲近有两点要指出:


状态不是可观察到的,您正尝试使用text: status()对其进行拆包。
您要将新的FileObject推入未包装的数组中,这意味着您将完全绕开可观察的对象。将新项目直接推入可观察数组,您会获得更好的运气。


我根据您的原始资料整理了jsbin example

具体来说,这是:

filesModel.myFiles().push(new FileObject(3, 'test_3')); // This never shows


应该:

filesModel.myFiles.push(new FileObject(3, 'test_3')); // Now it does

07-24 09:50
查看更多