首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Knockback.js过滤视图模型的集合

使用Knockback.js过滤视图模型的集合
EN

Stack Overflow用户
提问于 2014-10-21 07:52:54
回答 1查看 203关注 0票数 1

我目前正在使用Knockback.js创建一个页面,该页面将在表中显示员工的任务。我有一个任务的视图模型,其中包含一个名为isSelected的布尔值。员工的视图模型包含任务视图模型集合的集合,该集合称为“任务”。

现在我想添加一个名为“selectedTasks”的属性/函数/可观察到的属性,它只公开所选的任务。我想满足以下要求:

  • “任务”和“selectedTasks”都应该为我提供视图模型,而不是模型。
  • 当我向原始任务集合添加一个模型时,可以观察到的“任务”应该被更新。
    • 当用户选择这个新添加的模型时,“selectedTasks”也应该被更新。

  • 每个任务模型应该只有一个视图模型。否则,我可能会得到一个视图模型,它声明没有选择任务x,而另一个视图模型则表示选择了x。

为了更清楚地演示它,我创建了这个jsfiddle:http://jsfiddle.net/drojoke/cg6d88Lp/14/

到目前为止,我只使用一个可观察到的集合来实现“任务”属性的所有功能,如下所示:

代码语言:javascript
复制
this.tasks = kb.collectionObservable(tasks, {
    view_model: function (task) {
        return new TaskViewModel(task);
    }
});

我使用view_model选项将任务集合中的每个任务转换为TaskViewModel。当我将一个新任务添加到任务集合中时,CollectionObservable将被更新为exptected。

我尝试将selectedTasks属性创建为带有筛选器选项的CollectionObservable,如下所示:

代码语言:javascript
复制
this.selectedTasks = kb.collectionObservable(tasks, {
    view_model: function (task) {
        return new TaskViewModel(task);
    }, filters: function (task) {
        return task.isSelected(); // isSelected is undefined.
    }
});

但是不幸的是,传递给filters函数的对象不是TaskViewModel,而是一个任务对象,因此我无法访问isSelected

对于过滤视图模型集合而不是模型,我找不到很多。我如何创建一个可观察到的selectedTasks来过滤视图模型而不创建其他视图模型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-21 08:34:40

您可以简单地使用计算可观测值

代码语言:javascript
复制
this.selectedTasks = ko.computed(function() {
    return this.tasks().filter(function(task) {
        return task.isSelected();
    });
}, this);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26481544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档