Фильтрация коллекции моделей представлений в 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);
Другие вопросы по тегам