Knockout: как обновить одно поле в каждом из элементов массива ko.mapping

У меня есть большой наблюдаемый массив:

self.data = ko.mapping.fromJS(bigdata)

Мне нужно обновить одно поле каждого элемента в данных;

Самое простое решение

self.showAll = function() {
    for(var i = 0; i<self.data().length; i++) {
        self.data()[i].visible(true);
    }
}

Но он очень медленный, потому что вызывает обработчики после каждого обновления. Рекомендуется использовать такой код:

var items = ko.observableArray([]);
var underlyingArray = items();
for (var i = 0, j = underlyingArray.length; i < j; i++) {
    // work with underlyingArray
}
self.items.valueHasMutated();

Но это не работает с объектами ko.mapping.

Теперь я использую код вроде

var data = ko.mapping.toJS(self.data);
for(var i = 0; i<data.length; i++) {
  //
}
ko.mapping.fromJS(data, {}, self.data);

Мне это не нравится. Может есть что-то лучше? Есть ли способ приостановить работу всех обработчиков ko?


person Tarwirdur Turon    schedule 10.09.2014    source источник


Ответы (1)


Вы можете настроить сопоставление свойства visible, чтобы возвращать true при создании:

self.data = ko.mapping.fromJS(bigdata,
{
     'visible': { update: function(options) { return true; }}
});

См. документацию.

person haim770    schedule 10.09.2014
comment
Да, но мне нужно сделать это не в конструкторе модели. Если я вызову это на существующей модели, это будет не быстрее, чем мое первое решение. - person Tarwirdur Turon; 10.09.2014
comment
Вы хотите преобразовать массив, полученный от сервера, чтобы каждое свойство item.visible было установлено в true, я прав? - person haim770; 10.09.2014
comment
да. У меня уже есть элементы (и они уже отображаются в пользовательском интерфейсе), и мне нужно изменить каждое видимое свойство. - person Tarwirdur Turon; 10.09.2014