нокаутирующая производительность observableArray

#javascript #performance #knockout.js

#javascript #Производительность #knockout.js

Вопрос:

Как добавить все значения observableArray за один раз? Добавление значений в цикле в моем случае работает очень медленно. Вот пример jsfiddle. jsfiddle

Комментарии:

1. у меня есть одно замечание о добавлении элементов в проблему производительности массива, которую вы должны использовать array_name[array_name . длина-1] = ваш элемент; эта строка быстрее, чем метод push

2. я так думаю, смотрите эту статью scottlogic.co.uk/2010/10/javascript-array-performance и извините, я перепутал его array_name[array_name. длина] = ваш элемент

3. это также может быть полезно news.qooxdoo.org /…

Ответ №1:

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

вот и все

Комментарии:

1. Все еще не понимаю, почему самый элегантный и правильный ответ был отклонен :). Был бы признателен за объяснение.

2. Это действительно лучший подход для одновременного переноса всех элементов в массив. Вот сообщение о его использовании knockmeout.net/2012/04/knockoutjs-performance-gotcha.html

3. @Akshat Спасибо! После двух последовательных отказов от моего ответа я начал думать, что никто, кто его читал, на самом деле не пытается изучать javascript :). Еще раз спасибо.

4. Это, безусловно, лучший подход. Спасибо!

5. Прочитав связанную статью полностью (array.push != array.push.apply) Я могу только сказать, что @AGS действительно правильный и проиллюстрирован в JSFiddle статьи.

Ответ №2:

Поскольку вы очищаете весь наблюдаемый массив, один из способов добиться этого::

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

Комментарии:

1. Нет проблем. Существует также способ «отключить» поведение наблюдения, обновить вашу модель, а затем снова включить ее, но, похоже, я не могу найти для этого страницу.

2. использование array_name[array_name. длина-1]=item; быстрее, чем метод push

3. @James D’Angelo: я нашел метод ko.utils.unwrapObservable, но не могу найти, как «включить» наблюдаемое поведение

4. Я буду продолжать искать пример кода. Если я найду его, я добавлю его в свой ответ.

Ответ №3:

Уже есть выбранный ответ, но я подумал, что поможет следующее. Вы можете отключить поведение наблюдения, выполнив свой наблюдаемый массив, чтобы получить базовую реализацию массива:

 var underlyingArray = viewModel.someArr();
  

Затем вы можете добавлять элементы в underlyingArray без запуска someArr событий. Как только вы закончите добавлять элементы, вызовите:

 viewModel.someArr.valueHasMutated();
  

Это приведет к запуску события, уведомляющего все наблюдаемые, зависящие от ViewModel.someArr() .