【问题标题】:How can you create a custom filter for a Backbone collection?如何为 Backbone 集合创建自定义过滤器?
【发布时间】:2015-05-28 16:18:46
【问题描述】:

我正在使用三个 Backbone 模型/集合,我需要能够创建一个自定义过滤器,类似于在 .filter 方法中构建的 JavaScript。我有一个Build 模型,它与我的Module 模型有Backbone.HasMany 关系。第三个模型是Access,它有一个特定的构建和来自该构建的模块集合的模块子集,以允许用户访问。

我有一个视图,让管理员编辑访问权限。当管理员更改构建时,我希望模块列表使用某种类型的过滤器自动更新,但我无法轻松找到。这是我正在寻找的一些伪代码...

var build = access.get('build');
var modules = access.get('modules'); //backbone collection of module models
function onBuildChange(new_build){
    modules = modules.filter(function(module)){
        //if the new build contains this module, keep it in the colleciton
        return new_build.contains(module);
    }
    //update the ui to only show the new modules
    this.render();
}

我尝试在集合上只使用.filter,它没有出错,但它只是返回一个 JavaScript 数组。我知道我可以从该数组中创建一个新集合,但我想知道 Backbone 中是否已经内置了任何东西来处理这个问题。我知道.where,但我认为这不适用于这种情况,因为它不仅仅是检查属性是否等于值。

谢谢

【问题讨论】:

  • 之后我在过滤后的列表中使用过滤器和collection.reset() 让它工作。我希望有一种更优雅的方式,但这似乎可行。

标签: javascript html backbone.js


【解决方案1】:

所有的 Collection 方法都继承自 Underscore,它将它们作为数组返回,而不是作为新的 Collection。正如你所说,你可以从返回的数组中创建一个新的集合,或者如果你试图操纵当前的集合,你可以使用Backbone.Collection.reset

此外,如果您希望在视图中渲染一堆子视图,使用数组应该可以正常工作,因为您只需遍历数组并为每个返回的模型(模块?)创建一个子视图并附加将它们放到当前视图中,而无需操作 Collection 本身。

【讨论】:

    猜你喜欢
    • 2017-03-09
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多