Javascript 使用{silent:true}和触发器属性更改事件解析Backbone.js中的模型-调用集?

Javascript 使用{silent:true}和触发器属性更改事件解析Backbone.js中的模型-调用集?,javascript,model-view-controller,model,backbone.js,Javascript,Model View Controller,Model,Backbone.js,我有这样一个图表模型: //PSEUDO chartModel = Backbone.Model.extend({ defaults: { year : 1970, selected = ["Sweden", "Denmark"] } } 我现在想设置年份和所选日期: chartModel.set({year: 1987, selected : ["Finland"]}) 但在触发模型更改之前,我想“解决”对这个不稳定模型的更改。因此

我有这样一个图表模型:

//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)
我特别希望数据管理器在触发更改事件之前“区分”旧属性和新属性:

 callback : function(){
      chartModel.change();
 }
现在,当我知道正确的数据已就位时,我希望渲染视图

。。。但是我的侧边栏视图肯定会更改:选定的不渲染

Sidebar = Backbone.View.extend({    
    initialize: function(){
        this.model.bind("change:selected", this.render);
    }
    render : [...]
});
我的问题:

  • 手动触发model.change()时,为什么不触发单个属性更改事件

  • 我真的需要重写modelset方法来实现我想要的(“在同时更改多个属性时解析模型”),还是有更好的方法


  • 根据我对您的理解,我的意见是:

    • 很少或从不重写set方法;不知道你为什么觉得在这种情况下你必须这么做

    • 如果在没有{silent:true}的情况下调用set方法,则应该获得change:year和change:selected和change的事件。但是对象必须绑定到它们才能获得它们。请参阅bind函数

    • 如果调用change函数,则仅触发change事件。属性级事件不会被触发

    听起来您不应该重写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
        });
    
    
      }
    
    }))

    其中,模型本身绑定到a和b属性的更改事件,并通过检查是否可以计算c来处理这些事件,然后这样做,然后根据Ajax返回设置c的值。然后,模型将触发“change:c”,以便观察视图。我在视图中绘制了管道,这将启用此功能


    这是未经测试的代码,但希望在概念上接近。

    根据我对您尝试执行的操作的理解,我的观点是:

    • 很少或从不重写set方法;不知道你为什么觉得在这种情况下你必须这么做

    • 如果在没有{silent:true}的情况下调用set方法,则应该获得change:year和change:selected和change的事件。但是对象必须绑定到它们才能获得它们。请参阅bind函数

    • 如果调用change函数,则仅触发change事件。属性级事件不会被触发

    听起来您不应该重写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
        });
    
    
      }
    
    }))

    其中,模型本身绑定到a和b属性的更改事件,并通过检查是否可以计算c来处理这些事件,然后这样做,然后根据Ajax返回设置c的值。然后,模型将触发“change:c”,以便观察视图。我在视图中绘制了管道,这将启用此功能


    这是未经测试的代码,但希望在概念上接近。

    谢谢您的评论!假设我的模型具有依赖于A和B的属性C。设置A和B的特定组合必须触发异步数据加载请求-我们从中计算C的数据。在完成此操作之前,C不应触发其更改事件,该事件导致视图重新呈现,并根据选择更改哈希。为了实现这一点,我的想法是“静默地”更新set()上的属性,然后解决这些更改对模型的影响,然后触发set属性和计算属性的事件。但肯定有更好的方法吗?再次感谢您的宝贵意见。但是,当我设置了10个属性,并希望在更新视图和散列之前计算许多相互依赖的属性时,这个示例将变得非常昂贵。假设用户希望在“图表应用程序”中选择一个示例状态。set()方法接收10个不同的参数,根据这些参数的相互依赖关系,应该加载数据、更新比例等。当所有这些都解决后,是时候触发更改事件了。这就是我想要实现的逻辑……然后您可能只想注册change事件,或者查看changedAttributes函数以确定是否需要进行服务器调用。我想你现在可能已经有了解决这个问题所需的所有概念。谢谢你的评论!假设我的模型具有依赖于A和B的属性C。设置A和B的特定组合必须触发异步数据加载请求-我们从中计算C的数据。在完成此操作之前,C不应触发其更改事件,该事件导致视图重新呈现,并根据选择更改哈希。为了实现这一点,我的想法是“静默地”更新set()上的属性,然后解决这些更改对模型的影响,然后触发set属性和计算属性的事件。但肯定有更好的方法吗?再次感谢您的宝贵意见。但是,当我设置了10个属性,并希望在更新视图和散列之前计算许多相互依赖的属性时,这个示例将变得非常昂贵。假设用户希望在“图表应用程序”中选择一个示例状态。set()方法接收10个不同的参数,根据这些参数的相互依赖关系,应该加载数据、更新比例等。当所有这些都解决后,是时候触发更改事件了。这就是我想要实现的逻辑……那么您可能只想注册变更事件,或者看看