5

我正在转换我的主干应用程序,以便它开始与服务器通信,以前我刚刚使用测试数据填充集合.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 事件。

4

2 回答 2

6

fetch方法接受选项的散列。这些选项之一可以是“添加”选项,它在集合上调用add而不是reset

collection.fetch({ add: true });
于 2012-08-08T05:21:38.493 回答
5

来自精美手册

拿来 collection.fetch([options])

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

还有一个reset

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

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

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


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

拿来 collection.fetch([options])

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

因此,如果您使用的是 1.0+,那么您需要做的就是fetch使用该remove: false选项调用您的。

于 2012-08-05T04:28:15.260 回答