2013-04-19 14 views
8

Dostaję dużą tablicę obiektów poprzez AJAX i jeśli tablica ma dane zostanie on przekazany do ImportObservableListItems w moim viewmodel:Jak dodać tablicę obiektów do tablicy obserwowalnej w nokaut?

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

      ReadingList.ImportObservableListItems(data); 

      } 

w viewmodel chciałbym dodać każdy obiekt do zaobserwowania tablicy ale potrzebuję obserwować właściwości każdego obiektu. jeśli jednak tablica zawiera dużą liczbę obiektów, przeglądarka ulega awarii. czy jest jakiś sposób, żeby temu zapobiec?

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

ile jest "dużej liczby obiektów"? – Brandon

Odpowiedz

23

Można zmniejszyć zajętość przesuwając wszystkie elementy naraz (Push akceptuje kilka pozycji):

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

spowoduje tylko jedno zgłoszenie do wyjść, gdy wszystkie elementy zostały dodane zamiast jednego elementu na raz.

+0

Czy mogę Cię zapytać, czy można osiągnąć te same korzyści wydajnościowe, używając czegoś takiego jak: self.customObsArray ($. Map (dane, funkcja (element) { zwróć nowy CustomModel (element); })); lub jeszcze lepiej, używając ko.utils.arrayMap do usuwania zależności jquery. – Simone

+0

@Simone z pewnością pamiętaj, że twoja sugestia byłaby _placeniem_ istniejącej tablicy pozycji z nową tablicą elementów, która różni się semantycznie od tego, co chciał OP (chcieli _add_ elementów do istniejącej tablicy). – Brandon

Powiązane problemy