knockout数组总是0长度

时间:2012-07-12 16:30:41

标签: knockout.js

var viewModel = {
    foos: ko.observableArray([]);
}

var foo = function () {
    this.Prop1 = ko.observable,
    this.Prop2 = ko.observable
};

$.get("/someroute/", "", function(data) {
    for(var i = 0; i< data.length; i++) {
        var f = new foo();
        f.Prop1 = data.Prop1;
        f.Prop2 = data.Prop2;
        viewModel.foos.push(f);
    }
    ko.applyBindings(viewModel);
});

数据从get请求加载并循环数据,但viewModel.foos保持为[0]。

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

0) viewModel的定义不正确。应该是:

foos: ko.observableArray([])

没有分号;

1)您没有在foo的定义中正确定义可观察量。它应该是:

this.Prop1 = ko.observable()

因此缺少括号()

2)请记住上一点,这就是将值应用于字段的方式:

var f = new foo();
f.Prop1(data.Prop1);

3) JavaScript不会缓存数组的长度,所以无论何时使用.lengthlength不是属性,实际上都是getter)在循环中长度在每次迭代中进行评估。你应该使用:

var l = data.length;
for(var i = 0; i< l; i++) {

4) ko.applyBindings用于将视图模型绑定到文档。我不确定为什么在get请求结束时使用它,但如果你想多次使用get,那肯定会引发异常。特别是因为您的get没有修改DOM。我认为您应该在ko.applyBindings部分的某处运行$(document).ready(...)

5)最后,即使遇到所有这些错误,您的代码也应该有所帮助。我的意思是看相关部分:

for(var i = 0; i< data.length; i++) {
    // some other code
    viewModel.foos.push(f);
}

无论f是什么,它仍然被推送到viewModel的foos数组。如果在此之后得到foos 0的长度,那么这意味着data.length为0(或者我可能不明白[0]在您的问题中的含义)。没有其他解释。请参阅this jsFiddle

6)请记住,您可以使用viewModel.foos()访问实际的数组。因此viewModel.foos.length不正确。正确的长度为viewModel.foos().length