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]。
答案 0 :(得分: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
数组。如果在此之后得到foos
0的长度,那么这意味着data.length
为0(或者我可能不明白[0]
在您的问题中的含义)。没有其他解释。请参阅this jsFiddle。
6)请记住,您可以使用viewModel.foos()
访问实际的数组。因此viewModel.foos.length
不正确。正确的长度为viewModel.foos().length
。