#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() .