2013-04-19 5 views
8

Ich bin eine große Auswahl an Objekten durch Ajax bekommen und wenn die Array-Daten hat, dann wird es zu ImportObservableListItems in meinem Viewmodel übergeben werden:Wie fügt man Array von Objekten in Observable Array in Knockout?

 success: function (data) { 
      debugger 
      if (data.length > 0) { 

      ReadingList.ImportObservableListItems(data); 

      } 

in dem Viewmodel Ich mag würde jedes Objekt zu einer beobachtbaren Array hinzufügen aber ich brauche die Eigenschaften jedes Objekts, um beobachtbar zu sein. Wenn das Array jedoch eine große Anzahl von Objekten enthält, stürzt der Browser ab. Kann ich es irgendwie verhindern?

self.ImportObservableListItems = function (data) { 
      $.each(data, function(index, item) { 
       var newListItem = { 
        MediaID: ko.observable(item.MediaID), 
        MediaName: ko.observable(item.MediaName), 
        MediaTypeID: ko.observable(item.MediaTypeID), 
        MediaTypeName: ko.observable(item.MediaTypeName), 
        Group1: ko.observable(item.Group1), 
        Group2: ko.observable(item.Group2), 
        Group3: ko.observable(item.Group3), 
        Group4: ko.observable(item.Group4), 
        Group5: ko.observable(item.Group5) 
       }; 
       ReadingList.ReadingListItems.push(newListItem); 
      }); 
     }; 
+2

Wie viele sind "eine große Anzahl von Objekten"? – Brandon

Antwort

23

Sie die Abwanderungs durch Drücken alle Elemente auf einmal reduzieren können (Push mehrere Artikel akzeptiert):

var items = $.map(data, function (item) { 
    return { 
     MediaID: ko.observable(item.MediaID), 
     MediaName: ko.observable(item.MediaName), 
     MediaTypeID: ko.observable(item.MediaTypeID), 
     MediaTypeName: ko.observable(item.MediaTypeName), 
     Group1: ko.observable(item.Group1), 
     Group2: ko.observable(item.Group2), 
     Group3: ko.observable(item.Group3), 
     Group4: ko.observable(item.Group4), 
     Group5: ko.observable(item.Group5) 
    }; 
}); 

ReadingList.ReadingListItems.push.apply(ReadingList.ReadingListItems, items); 

Dies ist nur eine einzige Meldung verursacht zu gehen, wenn alle Elemente hinzugefügt wurden , statt einmal pro Artikel.

+0

kann ich Sie fragen, ob die gleichen Leistungsvorteile erreicht werden könnten, indem Sie etwas wie: self.customObsArray ($. Map (data, function (item)) { return new CustomModel (item); })); oder noch besser, indem Sie ko.utils.arrayMap verwenden, um die jQuery-Abhängigkeit zu entfernen. – Simone

+0

@Simone, denken Sie daran, dass Ihr Vorschlag das vorhandene Array von Elementen mit einem neuen Array von Elementen ersetzen würde, was semantisch anders ist als das, was das OP wollte (Sie wollten _Add_ Elemente zu einem vorhandenen Array hinzufügen). – Brandon

Verwandte Themen