2012-04-15 27 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。