2012-04-15 29 views
3

这里是JS:观察到数组的长度总是零

var view = function(){ 
    self.arry = ko.observable(); 

    self.arry(ko.mapping.fromJS([{prop:'Test'},{prop:'Test'}])); 

    console.log(self.arry().length);  
} 
var v = new view(); 

可观察到的阵列长度始终为零。我如何得到正确的长度?

编辑:
更新了JS并修复了错误。 http://jsfiddle.net/eRHTv/

var view = function(){ 
    var self = this; 
    self.arry = ko.observableArray(); 

    self.load_items = function(){ 
    setTimeout(function(){ 
    self.arry(ko.mapping.fromJS([{prop:'Test'},{prop:'Test'}])); 
    }, 100); 
    } 
    self.no_items_visible = ko.computed(function(){ 
    return (self.arry().length == 0); 
    }); 

    self.load_items(); 


    ko.applyBindings(self); 
} 

var v = new view(); 

当你运行这个,没有项目的div将始终是可见的,如果你做self.arry =数据,视图将不会更新。

+1

有很多事情遗漏或错误 - 你应该看看knockoutjs.com的互动教程 – Niko 2012-04-15 14:41:00

+0

问题可能不会帮助未来的访问者。我正在投票结束。 – nes1983 2012-04-15 14:48:28

回答

4

的第一件事是:你永远定义变量self

var self = this; 

二:ko.mapping.fromJS()如果输入的是一个数组返回一个可观察的数组:

self.arry = ko.mapping.fromJS(...); 

在总:

var view = function() { 
    var self = this; 

    self.arry = ko.mapping.fromJS([ {prop:'Test1'}, {prop:'Test1'} ]); 

    console.log(self.arry().length); 
} 

var v = new view(); 
+0

self.arry(ko.mapping.fromJS())的原因是视图会更新。通过这样做,self.arry()。length总是返回大于0. – firebird 2012-04-15 14:58:09

+1

如果需要使用另一个observableArray的值更新现有的observableArray,则需要传递数组,不需要observable:'self.arry(ko .mapping.fromJS([{prop:'Test1'},{prop:'Test2'}])()/ * <--- * /);' – Niko 2012-04-15 15:15:14

+0

修复了这个问题,谢谢。 – firebird 2012-04-15 15:20:00

2

这篇文章说明了为什么可观察到的阵列的长度总是等于0. 实际上,一个可观察数组(由ko.observableArray(...)返回)是一个函数。任何函数都有一个length属性。

这里更多:

https://github.com/knockout/knockout/issues/4

所以,你应该始终使用:myObservableArray()的长度,而不是myObservableArray.length。