3

目前我有一个服务器调用,它返回两个对象和一个我用来设置集合的对象。(我每 10 秒轮询一次,很快就会为此使用 socket.io)。

我注意到每次我将集合与对象一起使用时都会调用我的模型初始化函数。我认为这个集合很聪明,只添加/更改了 attr 或删除了模型,而对于那些没有改变的模型什么也没做。

// All Orders Collection
var AllOrders = Backbone.Collection.extend({
    model: Order,
    url: '/venues/orders'
 });


 var Order = Backbone.DeepModel.extend({
     idAttribute: 'orderid',
     url: '/venues/orders',


    initialize : function(){
        // this is called everytime i use set even if model is in collection
        // do stuff
    }
 })


 *****************
 app.allOrders.set( app.getOrders.get('orders') );
4

2 回答 2

2

如果您查看主干源,

将模型合并到集合中时,会在合并之前调用_prepareModel方法,该方法会根据传入的属性创建一个新模型。

这是设置代码

 if (!(model = this._prepareModel(attrs = models[i], options))) continue;

    // If a duplicate is found, prevent it from being added and
    // optionally merge it into the existing model.
    if (existing = this.get(model)) {
      if (remove) modelMap[existing.cid] = true;
      if (merge) {
        attrs = attrs === model ? model.attributes : options._attrs;
        existing.set(attrs, options);
        if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;
      }

所以发生的事情是,

  • 从您传入的属性创建一个新模型
  • 查询集合以查找与新模型具有相同 id 的现有模型。
  • 如果合并选项是true,它将新属性推送到现有模型。
于 2013-06-26T18:17:07.340 回答
0

这取决于您如何编写客户端和服务。默认情况下,GET /venues/orders 返回整个订单列表。如果您只想获取更改,则必须为保留当前订单的订单集合编写自定义同步,并仅从服务器获取更改(例如,您发送当前 ID,或者您发送上次调用的时间戳)。顺便提一句。每个获取的模型都会调用初始化,因为它们是从 json 创建的,并且 collection.set 无法将 json 对象与骨干模型进行比较,它只能将骨干模型与骨干模型进行比较。

可能的解决方案:

  1. 覆盖设置以将 json 与骨干模型进行比较。
  2. 覆盖您的app.getOrders.get('orders')和服务器端代码以仅下拉更改,或从提取的 json 中手动删除已经存在的对象。
  3. 将您的代码从初始化移动到另一个地方,例如到 collection.add 事件处理程序。
于 2013-06-26T18:26:16.060 回答