【问题标题】:Backbone / Underscore chain method with where method主干/下划线链方法与 where 方法
【发布时间】:2012-10-16 22:57:28
【问题描述】:

这里一定有一些我想念的简单的东西。

http://jsfiddle.net/v9mdZ/

我刚刚学习 Backbone 和 Underscore/loDash,正在努力熟悉 chain

我有以下代码,按预期工作:

var ids = _.pluck(collection.where({'is_checked':true}), 'id');

我尝试使用chain 重构它,如下所示:

var ids = collection.chain().where({'is_checked':true}).pluck('id').value();

为什么重构后的代码不起作用?我是不是用错了chain

解决方案(详情如下)

不要将wherechain 一起使用。

【问题讨论】:

    标签: backbone.js underscore.js lodash


    【解决方案1】:

    some Underscore methods 合并到集合中有点不完美。当你说collection.some_mixed_in_underscore_method() 时,集合会在你背后解开一些 Backbone 的东西,以便将 Underscore 方法应用于集合模型内的属性;它的工作原理是这样的:

    var ary = _(this.models).map(function(m) { return m.attributes });
    return _(ary).some_mixed_in_underscore_method();
    

    但是collection.chain() 不是这样工作的,chain 只是直接包装集合的models 所以如果你这样做:

    console.log(collection.chain());
    

    您会看到chain 为您提供了一个包含模型数组的对象。您的模型将没有is_checked 属性(即没有model.is_checked),但它们将具有is_checked 属性(即将有model.get('is_checked')model.attributes.is_checked)。

    现在我们可以看到哪里出了问题:

    collection.chain().where({'is_checked':true})
    

    模型没有is_checked 属性。特别是,不会有任何模型,其中is_checkedtrue 并且where 之后的所有内容都使用空数组。

    既然我们知道事情的发展方向,那我们该如何解决呢?好吧,您可以使用filter 而不是where,这样您就可以轻松解压模型:

    collection.chain()
              .filter(function(m) { return m.get('is_checked') })
              .pluck('id')
              .value();
    

    但是,您的模型还没有 ids,因为您没有使用 ids 创建它们,并且您还没有与服务器交谈以获取 ids,因此您将获得一组undefineds 返回。如果你添加一些ids:

    var collection = new App.OptionCollection([
        {id: 1, 'is_checked': true},
        {id: 2, 'is_checked': true},
        {id: 3, 'is_checked': false}
    ]);
    

    然后你会得到你正在寻找的[1,2]

    演示:http://jsfiddle.net/ambiguous/kRmaD/

    【讨论】:

    • 很好的解释。谢谢!在我的实际环境中,集合是从服务器获取的,所以它们确实有 id。
    • pluck 对于大多数属性都会有同样的问题,因为它不调用model.get(),而是直接查看模型的属性。 id 是在对象上定义的特殊属性,因此它可以工作,但其他属性,例如 is_checked 将返回 undefined
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2012-10-17
    • 2012-10-21
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    相关资源
    最近更新 更多