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

У меня есть простой пример, чтобы проиллюстрировать это. Возьмите a, который просто содержит массив элементов. Каждая строка имеет наблюдаемое свойство, в данном случае дату. Пользовательский интерфейс привязан к набору отсортированных элементов, который является просто вычисляемым наблюдаемым. Эта вычисляемая наблюдаемая, в свою очередь, наблюдает за вычисляемой наблюдаемой, которая будет отфильтровывать строки.

Почему это не каскадно, как хотелось бы?

//simple table model
var TableModel = function(){
var self = this;
self.items = ko.observableArray([
new TableRowModel(5),
new TableRowModel(2),
new TableRowModel(9),
new TableRowModel(7)
]);
 self.filtered = ko.computed(function(){
return [self.items()[0], self.items()[1], self.items()[2]];
 });
 self.sortedItems = ko.computed(function(){
return _.sortBy(self.filtered(), function(item){
    return item.value();
});
});
};

var TableRowModel = function(value){
  var self = this;

self.value = ko.observable(new Date(2013, value, 1));
};

var model = new TableModel();
ko.applyBindings(model);

model.items.push(new TableRowModel(1));

person Oliver Kane    schedule 14.01.2013    source источник
comment
Пример: jsfiddle.net/tyzy5/19 Где моя запись за февраль? Он должен быть первым в этом списке.   -  person Oliver Kane    schedule 14.01.2013


Ответы (1)


В вашем коде все работает нормально. «Февраль» здесь отсутствует, потому что он отфильтрован.

Метод push() вставляет новый элемент в последнюю позицию. Но в вашем self.filtered вы отображаете только элементы, которые находятся в позиции 0, 1, 2. Но когда вы вызываете push в своем коде, новый элемент будет быть вставлен в позицию 4, поэтому он не будет отображаться.

Если вы хотите, чтобы отображался «Февраль», вы можете использовать unshift:

myObservableArray.unshift('Некоторое новое значение') вставляет новый элемент в начало массива

Итак, в вашем коде:

model.items.unshift(new TableRowModel(1));

Вот обновленный JSFiddle.

person nemesv    schedule 14.01.2013
comment
nemesv, я вам дам ответ, так как вы очень правильно написали. - person Oliver Kane; 14.01.2013
comment
Я попытался воссоздать проблему, используя мой реальный источник, без логики взаимодействия с сервером, но не смог воспроизвести проблему. Если вы знакомы с ASP.NET MVC, не могли бы вы посмотреть мой первоисточник? Я чувствую, что на данный момент я не помог сообществу решить этот вопрос, поскольку я в основном опубликовал тривиальную проблему и, похоже, не могу продублировать / продемонстрировать ту, что у меня есть в dev. - person Oliver Kane; 14.01.2013
comment
Не берите в голову! Я обнаружил свою проблему. observableArray не прослушивает обновленные значения дочерних объектов (по умолчанию), а только то, что новый объект был удален/добавлен в массив. - person Oliver Kane; 15.01.2013
comment
@OliverKane да, вы правы: An observableArray tracks which objects are in the array, not the state of those objects как указано в документации. - person nemesv; 15.01.2013