Наблюдаемый массив нажимает несколько объектов в knockout.js
Есть ли какой-либо параметр в ko, который одновременно подталкивает несколько элементов?
У меня есть два элемента, которые необходимо вставить в наблюдаемый массив под названием StatesList
, я не могу продолжить. Как я могу добавить их оба.
см. ниже:
var model1 = jQuery.parseJSON(ko.toJSON(argsToPost));
var model = jQuery.parseJSON(ko.toJSON(self.StateModel));
Мне нужно добавить оба в мой ObservableArray
self.StatesList.push(model);
self.StatesList.push(model1);
Это вставка в разные записи, я хочу вставить оба объекта одновременно
Ответы
Ответ 1
У нас есть ko.utils.arrayPushAll(array, valuesToPush)
как служебная функция, которую вы можете использовать. Однако он недоступен непосредственно наблюдаемым массивам.
Если вы добавите pushAll to observableArrays
, вам нужно будет работать с базовым массивом (this() в вашем случае), а затем вызывать valueHasMutated()
в конце observableArray
в конце. Это гарантирует, что подписчики observableArray
уведомляются только один раз с конечным результатом, а не с каждым нажатием.
В ядре KO ему также нужно будет позвонить valueWillMutate()
заранее.
Дело в том, что я бы не рекомендовал использовать код, который вы опубликовали, поскольку он будет уведомлять о каждом нажатии, что может повлиять на производительность, если вы нажимаете много элементов.
В ядре мы можем сделать что-то вроде:
ko.observableArray.fn.pushAll = function(valuesToPush) {
var underlyingArray = this();
this.valueWillMutate();
ko.utils.arrayPushAll(underlyingArray, valuesToPush);
this.valueHasMutated();
return this; //optional
};
То же самое происходило между John Papa
и RP Niemeyer
. Ссылка можно найти здесь. Следовательно, здесь были представлены полезные советы.
Ответ 2
Try
ko.utils.arrayPushAll(self.StatesList, [model, model1]);
Ответ 3
Функция A pushAll
обсуждалась на github, см., например, этот вопрос или этот запрос на растяжение. Насколько я понял, он еще не попал в основной код.
Однако вы можете легко достичь push-all, например:
var items = ko.observableArray();
items.push.apply(items, [1, 2, 3, 4]);
как прокомментировал stalniy во второй ссылке. Недостатком этого является то, что нокаут будет уведомлять подписчиков после того, как каждый отдельный элемент будет нажат.
В качестве альтернативы,
function concat(the_list, items_to_concat) {
the_list.splice.apply(the_list, [the_list().length, 0].concat(items_to_concat));
}
используя, таким образом, реализацию observableArray
splice
, предложенную brianmhunt в том же потоке.
Кстати: я признаю, что я не знал этого наизусть, я просто искал "толчок много нокаутов"