2012-04-15 6 views
3

이다 :관찰 배열 길이는 JS 여기서 항상 0

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(); 

관찰 가능한 배열 길이는 항상 0이다. 올바른 길이를 얻으려면 어떻게해야합니까?

편집 :
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(); 

이를 실행하면, 아이템의 사업부는 항상 볼 수 없습니다 당신이 self.arry = 데이터를 할 경우, 뷰는 업데이트되지 않습니다.

+1

많은 것들이 누락되었거나 잘못되었습니다 - 아마도 knockoutjs.com의 대화식 튜토리얼을 확인해야합니다 – Niko

+0

질문은 아마도 미래의 방문자를 돕지 않을 것입니다. 나는 투표를 끝내겠다. – nes1983

답변

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

+1

기존 observableArray를 다른 observableArray의 값으로 업데이트해야하는 경우 관찰을 허용하지 않고 배열을 전달해야합니다. 'self.arry (ko .mapping.fromJS ([{prop : 'Test1'}, {prop : 'Test2'}])()/* <--- * /); ' – Niko

+0

그 덕분에 문제가 해결되었습니다. – firebird

2

이 게시물은 관측 가능한 배열의 길이가 항상 사실, 관측 가능한 배열 (ko.observableArray (...)에 의해 반환 됨)은 함수입니다. 모든 함수에는 length 속성이 있습니다. 여기

더보기 :

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

그래서, 당신은 항상 사용해야합니다 myObservableArray() 대신 myObservableArray.length의 길이를..