2014-02-21 5 views
5

Ich versuche, Elemente aus dem Server Observable Array in Knockout hinzuzufügen.Warum kann ich keine Daten zu beobachtbaren Array in knockout concut

Hier ist meine Viewmodel:

function ArticlesViewModel() { 
    var self    = this; 
    this.listOfReports  = ko.observableArray([]); 

    self.loadReports = function() { 
     $.get('/router.php', {type: 'getReports'}, function(data){ 
      for (var i = 0, len = data.length; i < len; i++){ 
       self.listOfReports.push(data[i]); 
      } 
     }, 'json'); 
    }; 

    self.loadReports(); 
}; 

Und es funktioniert perfekt. Aber ich weiß, dass ich zwei Arrays in Javascript unter Verwendung concat() und soweit ich weiß concat works in knockout zusammenführen kann. Wenn ich also versuche, meine for-Schleife durch oder self.listOfReports.concat(data); zu ersetzen, erscheint nichts auf dem Bildschirm.

Im ersten Fall gibt es keinen Fehler, im zweiten Fehler sagt mir, dass es keine Methode concat gibt.

Also wie kann ich die Daten ohne meine Schleife concat. Und ich würde wirklich glücklich sein zu hören, warum meine Methode nicht

arbeitet
+1

ObservableArrays unterstützen die Concat-Methode nicht, es gibt ein offenes Problem dazu: https://github.com/knockout/knockout/issues/786 – Tanner

+0

Seltsam, weil ich dachte, dass in [diese Frage] (http: // stackoverflow.com/q/19221174/1090562) eine Person ist beobachtbare Array. Soweit ich das verstanden habe, ist der Ansatz (Looping und Pushing) der beste? –

+0

Ich könnte mich dann irren, ich neige immer dazu, die Loop/Push-Methode zu verwenden – Tanner

Antwort

10

Die observableArrayhat nicht die concat Methode unterstützen. Siehe die Dokumentation für die offiziell unterstützte array manipulation methods.

jedoch, was Sie tun können, ist concat auf die zugrunde liegende Array rufen und dann diese die neue verkettete Arrays Ihre beobachtbare neu zuweisen:

self.listOfReports(self.listOfReports().concat(data)); 

Die linked example funktioniert, weil die self.Products().concat(self.Products2()) in einer Schleife verwendet wurden. Wenn Sie nur self.listOfReports().concat(data); schreiben, verkettet es noch, aber Sie haben das Ergebnis einfach weggeworfen und speichern es nirgends, deshalb müssen Sie es wieder in Ihrem observableArray speichern.

+0

Dies sollte etwas in KO-Kern auch enthalten sein. – Nishanthan

+1

Ein etwas effizienterer Ansatz besteht darin, die Push-Methode wie folgt zu verwenden: 'self.listOfReports.push.apply (self.listOfReports, data)' – csnate

Verwandte Themen