如何在一个处理程序中处理多个主干模型更改

时间:2014-01-17 08:45:34

标签: backbone.js marionette backbone-events backbone-model

我有一个View和一个与骨干相关的模型。查看观察模型更改并相应更改其显示区域。例如:

var Part = Bacbone.Model.extends({
  defaults:{
    partId = null,
    manufacturer: null,
    manufactureDate: null,
    type: null
  }
});

var PartsCollection = Backbone.Collection.extends({
   model:Part;
)};

var Car = Backbone.Model.extends({
   defaults:{
       carModel: null,
       carName: null,
       color: null,
       partsCollection: null
   },  
   //Overwite the parse method to fill partsCollection
   parse: function(response){
       // creating partsCollection from response and adding an attribute
       // response.partsCollection = new PartsCollection();
       retrun response;
   }
});

我有一个类似于上面所示的结构。在我的设计策略中,我在模型更改时更改视图内容。

现在,例如,如果我用5000个零件中的1000个零件替换制造商'A'和制造商'B'。这应该修改我的视图,为此我在视图中监听模型更改事件。由于1000个零件修改,将触发1000个更改事件。

由于制造商的变化,我可能还想更改零件模型的'manufacturerDate'属性,如果我也改变'manufacturerDate'attr,那又将触发另外1000个事件。

在我看来处理这些事件可能不是一个好主意,这就是我的感受。所以任何人都可以建议我解决这个问题的方法

2 个答案:

答案 0 :(得分:0)

我不知道,这是否是正确的方法,但我提出以下解决方案。不要直接在CarView中对 Part 模型进行更改。而是在 CarView 中为汽车模型change:manufacturer中的集合添加this.model.partsCollection事件的侦听器。在集合上添加API changeManufacturer,该集合接受一系列零件(或零件ID)和新的制造商详细信息。 API将更新零件制造商并触发事件change:manufacturer任何想要更改镜头中零件制造商的代码都将使用集合API changeManufacturer,CarView可以监听事件change:manufacturer并自我更新。

var CarView = Backbone.View.extend({
    initialize: function() {
        // do other stuffs
        this.listenTo(this.model.partsCollection, "change:manufaturer", manufacturereChanged);

    },

    manufacturereChanged: function(arrOfChangedParts) {
        // you now have all changed parts array
        // process as your logic
    }
});


var PartsCollection = Backbone.Collection.extend({
   model: Part,
   changeManufacturer: function(arrPartIds, newManfacturerDetails) {
      var arrChangedModels = [];
      // iterate over ids
          // get the model and change manufacturer info in model
          // add changed model to arrChangedModels
      // ends loop

      // once all models are changed trigger an event "change:manufacturer"
      this.trigger('change:manufacturer', arrChangedModels)
   }
});

答案 1 :(得分:0)

除了有更多选项可以识别与先前集合和新值之间的差异之外,集合具有与其模型相同的收听变更的能力。

理想情况下,一个触发器应该可以很好地使用n项更新视图。