【问题标题】:Does backbone trigger .add when a collection is .fetched?.fetched 集合时主干会触发 .add 吗?
【发布时间】:2012-08-05 04:15:29
【问题描述】:

我正在转换我的主干应用程序,以便它开始与服务器通信,之前我刚刚使用 .add() 使用测试数据填充集合

我已将一些事件绑定到集合添加事件。因此,每次将项目添加到集合中时,我都可以渲染视图并更新一些统计信息。

似乎只要我添加.fetch() 调用以从服务器获取数据,添加事件就会停止。

例如

var PayableCommitmentCollection = Backbone.Collection.extend({
    model:PayableCommitment,
    url:"/cc/account/contributions/",

    initialize: function() {
        this.bind("add",this.setInitialAmount,this);
    }
 }

this.SetInitialAmount() 在 fetch 创建集合中的模型后永远不会被调用。

我还有 2 个视图正在监视要添加到此集合中的项目,这些项目现在没有更新。

我的明显工作是编写自己的 AJAX 调用,这样我就可以像目前为止在开发过程中一样添加项目,但是我确信骨干有智慧来帮助我。

任何人都可以提出一种方法,我可以绑定到 fetch 的完成,或者让它刺激 add 事件。

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    fetch 方法接受选项哈希。其中一个选项可以是“add”选项,它在集合上调用 add 而不是 reset

    collection.fetch({ add: true });
    

    【讨论】:

    • 不再适用于 Backbone 1.0.0。请参阅对上述答案的评论。
    【解决方案2】:

    来自fine manual

    获取 collection.fetch([options])

    从服务器获取此集合的默认模型集,当它们到达时重置集合。

    还有一个reset

    重置 collection.reset(models, [options])

    一次添加和删除一个模型固然很好,但有时您要更改的模型太多,您宁愿只批量更新集合。使用 reset 将集合替换为新的模型列表(或属性哈希),最后触发单个 "reset" 事件。

    所以fetch 将触发单个"reset" 事件,而不是一堆"add" 事件。您需要一个可以绑定到 "reset" 的集合范围版本的 setInitialAmount


    在 Backbone 1.0 中,Collection#fetch 有这样的说法:

    获取 collection.fetch([options])

    从服务器获取此集合的默认模型集,当它们到达时将它们设置在集合中。
    [...]
    fetch 的行为可以通过使用可用的set 选项进行自定义。例如,要获取一个集合,为每个新模型获取一个 "add" 事件,为每个更改的现有模型获取一个 "change" 事件,而不删除任何内容:collection.fetch({remove: false})

    所以,如果您使用的是 1.0+,那么您需要做的就是使用 remove: false 选项调用您的 fetch

    【讨论】:

    • 谢谢,这让重置更有意义。我原以为收藏品是空的。我还能够更改我的测试工具以使用重置。
    • 在 Backbone 1.0.0 中,您现在通过将 remove: false 作为选项传递给 fetch 来完成此操作。
    • @Radu:感谢您的提醒。现在好点了吗?
    • 是否也可以使用可用的set 选项自定义行为reset?例如,如果我想在 reset 期间触发 add 事件。
    • @fortuneRice: resetadd 称为this.add(models, _.extend({silent: true}, options));silent:true 应该关闭来自this.add 的事件,因此您可能需要将silent:false 添加到选项中(可能会产生不良副作用)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多