2012-04-15 5 views
3

ist hier die js:beobachtbaren Feldlänge ist immer Null

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

Die beobachtbare Feldlänge immer gleich Null ist. Wie bekomme ich die richtige Länge?

Bearbeiten:
Die JS aktualisiert und die Fehler behoben. 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(); 

Wenn Sie dies ausführen, werden keine Elemente div immer sichtbar sein, und wenn Sie tun self.arry = Daten, wird die Ansicht nicht aktualisiert.

+1

Es gibt viele Dinge, die fehlen oder falsch mit diesem - sollten Sie wahrscheinlich die interaktiven Tutorials auf knockoutjs.com – Niko

+0

Frage wahrscheinlich nicht zukünftige Besucher helfen. Ich stimme zu schließen. – nes1983

Antwort

4

Erste Sache ist: Sie definieren nie die Variable self:

var self = this; 

Zweitens: ko.mapping.fromJS() gibt einen beobachtbaren Array, wenn die Eingabe ein Array ist:

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

insgesamt:

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

Der Grund für self.arry (ko.mapping.fromJS()) ist, dass die Ansicht dann aktualisiert wird. Auf diese Weise gibt self.arry(). Length immer größer als 0 zurück. – firebird

+1

Wenn Sie ein vorhandenes observableArray mit den Werten eines anderen observableArray aktualisieren müssen, müssen Sie das Array übergeben, no das Observable: 'self.arry (ko .mapping.fromJS ([{prop: 'Test1'}, {prop: 'Test2'}])()/* <--- * /); ' – Niko

+0

Das hat das Problem behoben. – firebird

2

Dieser Beitrag erklärt, warum immer die Länge eines beobachtbaren Array ist gleich 0. Tatsächlich ist ein beobachtbares Array (zurückgegeben von ko.observableArray (...)) eine Funktion. Jede Funktion hat eine Längeneigenschaft.

Mehr hier:

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

Also, sollten Sie immer wie folgt: myObservableArray() Länge statt myObservableArray.length..