1
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]。

4

1 回答 1

1

您的代码存在一些问题:

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

foos: ko.observableArray([])

没有分号;

1)您没有在foo. 它应该是:

this.Prop1 = ko.observable()

所以括号()不见了。

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

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

3) JavaScript 不缓存数组的长度,因此每当您在循环中使用.length(length不是属性,它实际上是一个 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数组中。如果在那之后你得到foos0 的长度,那么这意味着它data.length是 0 (或者我可能不明白[0]你的问题是什么意思)。没有其他解释。看到这个 jsFiddle

6)请记住,您可以使用viewModel.foos(). 因此viewModel.foos.length是不正确的。正确的长度是viewModel.foos().length

于 2012-07-12T17:38:23.087 回答