Backbone.js中的解析模型-使用{silent:true}进行呼叫设置并触发属性更改事件?

问题描述

| 我有一个这样的图表模型:
//PSEUDO
chartModel = Backbone.Model.extend({
     defaults: {
         year : 1970,selected = [\"Sweden\",\"Denmark\"]
     }
 }
我现在想同时设置年份和选定年份:
chartModel.set({year: 1987,selected : [\"Finland\"]})
但是在触发模型更改之前,我想“解决”此不稳定模型的更改。因此,我传递了silent:true并覆盖了set方法:
chartModel.set({year: 1987,selected : [\"Finland\"]},{silent:true})

//Pseudo set override
set : function(attrs,options) {

  // Extract attributes and options.
  options || (options = {});
  if (!attrs) return this;
  if (attrs.attributes) attrs = attrs.attributes;
  var now = this.attributes,escaped = this._escapedAttributes;

  [...]

  datamanager.loadNewDataIfNeeded(oldModel,newModel,callback)
我特别希望数据管理器在触发change事件之前将旧属性与新属性“区别”:
 callback : function(){
      chartModel.change();
 }
现在-当我知道正确的数据到位时-我想渲染视图。 ...但是我的补充工具栏视图必然会更改:selected无法渲染?
Sidebar = Backbone.View.extend({    
    initialize: function(){
        this.model.bind(\"change:selected\",this.render);
    }
    render : [...]
});
我的问题: 手动触发model.change()时,为什么不触发单个属性更改事件? 我是否真的需要重写模型集方法来实现我想要的目标(“同时更改多个属性时解析模型”),还是有更好的方法?     

解决方法

        根据对您要做什么的理解,我的看法是: 很少或永远不会重写set方法;不知道为什么要在这种情况下必须这样做。 如果在不使用{silent:true}的情况下调用set方法,则应获取事件change:year和change:selected并进行更改。但是必须将对象绑定到它们才能获取它们。请参见bind函数。 如果调用更改功能,则仅触发更改事件。属性级别事件不会触发。 听起来您不应该重写set方法,而只是确保对那些对模型更改感兴趣的对象具有适当的绑定。同样,消除沉默:真正的通道。 这是根据您的评论的一些代码:
Thing = Backbone.Model.extend({

  initialize: function(attributes,options) {
    this.bind(\'change:a\',this.calculateC);
    this.bind(\'change:b\',this.calculateC);
  },canCalculateC: function() {
    return this.get(\'a\') == someMagicalValueForA && 
           this.get(\'b\') == someMagicalValueForB;
  },calculateC: function() {
    if (!this.canCalculateC()) return;
    var self = this;
    $.post(\'some/url\',function(data) {
      var c = // extract value for c
      this.set({c: c});  // which triggers the \'change:c\' and \'change\' events
    });


  }
});
ThingView = Backbone.View.extend({

  initialize: function(options) {
    this.model.bind(\"change:c\",this.render);
  }

  ...

});
模型本身绑定到更改a和b属性的事件,并通过检查是否可以计算c来处理这些事件,然后这样做,然后根据Ajax返回值设置c的值。然后,该模型将触发\'change:c \'以供观察。我在视图管道中进行了素描,以实现此目的。 这是未经测试的代码,但希望在概念上接近。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...