2011-11-02 12 views
7

Jak dodać wszystkie wartości do observableArray w jednym czasie? Dodawanie wartości w pętli działa bardzo wolno w moim przypadku. Oto przykład jsfiddle. jsfiddlenokaut obserwowalnyArray wydajność

+0

mam jedną notatkę o dodawanie elementów do tablicy problemu z wydajnością, że należy użyć ARRAY_NAME [array_name.length-1] = swój przedmiot; ta linia jest szybsza niż metoda push – Marwan

+0

Czy różnica jest naprawdę duża? – Neir0

+0

Myślę, że tak, zobacz ten artykuł http://www.scottlogic.co.uk/2010/javascript-array-performance/ i przepraszam, pomyliłem jego nazwę array_name [array_name.length] = Twój przedmiot – Marwan

Odpowiedz

7

Skoro oczyszczaniu całą zaobserwowania tablicę, jeden sposób można to osiągnąć jest:

var viewModel = { 
    name: "base", 
    addingValue:new ko.observable(), 
    someArr: new ko.observableArray(["123","432","sdafasd","xrere"]), 
    add: function() 
    { 
     this.someArr.push(this.addingValue()); 
    }, 
    updateSomeArr:function() 
    { 
     var temp = []; 

     for(var i=0;i<5;i++) 
     { 
      temp.push("555565"); 
     } 

     this.someArr(temp); 
    } 
} 
+0

haha. Dzięki – Neir0

+0

Bez problemu. Istnieje również sposób na "wyłączenie" zachowania obserwującego, zaktualizowanie modelu, a następnie jego ponowne włączenie - ale nie mogę znaleźć dla niego strony. –

+0

using array_name [array_name.length-1] = element; jest szybsza niż metoda push – Marwan

3

Jest już wybrana odpowiedź, ale myślałem, że po pomoże. Można wyłączyć zachowanie obserwacji wykonując swoją zaobserwowania tablicę, aby uzyskać podstawową realizację tablicy:

var underlyingArray = viewModel.someArr(); 

Można następnie dodać elementy do underlyingArray bez wystrzelenie someArr wydarzenia. Po zakończeniu dodawania elementów, zadzwoń:

viewModel.someArr.valueHasMutated(); 

To spowoduje, że zdarzenie na ogień powiadamiania wszystkie obserwable zależne viewModel.someArr().

17
var myArray = ko.observableArray([]); 
var valuesToInsert = [1,2,3]; 
myArray.push.apply(myArray, valuesToInsert); 

to wszystko

+0

Chcesz wiedzieć, dlaczego odpowiedź została odrzucona. – AGS

+0

Nadal nie rozumiem, dlaczego najbardziej elegancka i poprawna odpowiedź została odrzucona :). Byłbym wdzięczny za wyjaśnienie. – AGS

+1

To jest naprawdę najlepsze podejście, aby przesłać wszystkie elementy do tablicy na raz.Tutaj jest post na jego wykorzystanie http://www.knockmeout.net/2012/04/knockoutjs-performance-gotcha.html –