Подтвердить что ты не робот

Наблюдаемый массив нажимает несколько объектов в 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);

Это вставка в разные записи, я хочу вставить оба объекта одновременно

4b9b3361

Ответ 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 в том же потоке.

Кстати: я признаю, что я не знал этого наизусть, я просто искал "толчок много нокаутов"