Фильтрация коллекции моделей представлений в Knockback.js
В настоящее время я создаю страницу, используя Knockback.js, которая отображает задачи сотрудника в таблице. У меня есть модель представления для задачи, которая содержит логическую наблюдаемую переменную isSelected. Модель представления для сотрудника содержит набор наблюдаемых из коллекции моделей представления задач, называемых "задачами".
Теперь я хочу добавить атрибут / функцию / наблюдаемый с именем selectedTasks, который выставляет только выбранные задачи. Я хочу соответствовать следующим требованиям:
- И "задачи", и "выбранные задачи" должны давать мне представление о моделях, а не о моделях.
- Когда я добавляю модель в исходную коллекцию задач, наблюдаемые "задачи" должны обновляться.
- Когда пользователь выбирает эту новую добавленную модель, "selectedTasks" также должны обновляться.
- Для каждой модели задачи должна быть только одна модель представления. В противном случае я мог бы получить модель представления, в которой говорится, что задача x не выбрана, в то время как другая модель представления утверждает, что x выбран.
Чтобы продемонстрировать это немного яснее, я создал этот jsfiddle: http://jsfiddle.net/drojoke/cg6d88Lp/14/
До сих пор мне удалось заставить все работать с атрибутом 'tasks', используя наблюдаемую коллекцию, как показано здесь:
this.tasks = kb.collectionObservable(tasks, {
view_model: function (task) {
return new TaskViewModel(task);
}
});
Я использую view_model
возможность превратить каждую задачу в коллекции задач в TaskViewModel
, Когда я добавляю новую задачу в коллекцию задач, CollectionObservable
обновляется как подтвержденный.
Я пытался создать selectedTasks
атрибут как CollectionObservable
с опцией фильтра, вот так:
this.selectedTasks = kb.collectionObservable(tasks, {
view_model: function (task) {
return new TaskViewModel(task);
}, filters: function (task) {
return task.isSelected(); // isSelected is undefined.
}
});
Но, к сожалению, объект, который передается в функцию фильтров, не является TaskViewModel
, но просто объект задачи, поэтому у меня нет доступа к isSelected
наблюдаемым.
Я не мог найти много о фильтрации коллекций моделей вместо моделей. Как я могу создать наблюдаемые задачи selected, которые фильтруют модели представлений и не создают дополнительных моделей представлений?
1 ответ
Вы можете просто использовать вычисляемые наблюдаемые:
this.selectedTasks = ko.computed(function() {
return this.tasks().filter(function(task) {
return task.isSelected();
});
}, this);