Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 主干应用程序的结构。模型/收集问题_Backbone.js - Fatal编程技术网

Backbone.js 主干应用程序的结构。模型/收集问题

Backbone.js 主干应用程序的结构。模型/收集问题,backbone.js,Backbone.js,我的应用程序的逻辑非常简单。我有一个获取JSONP的模型(数据包含年份、季度,季度包含不同的键:value)。获取数据后,View会侦听模型的“更改”事件,然后呈现数据。到目前为止还不错 但接下来我需要监听“change:year”/“change:quarter”,并根据更改使用新的url获取数据。但当“变更:年度”/“变更:季度”被解雇时,全球“变更”也被解雇 当然,如果我使用集合而不是模型的话——这是我的“重置”。但在这种情况下,我不能那么容易地听到“变化:年”——我必须再创建几个模型(针

我的应用程序的逻辑非常简单。我有一个获取JSONP的模型(数据包含年份、季度,季度包含不同的键:value)。获取数据后,View会侦听模型的“更改”事件,然后呈现数据。到目前为止还不错

但接下来我需要监听“change:year”/“change:quarter”,并根据更改使用新的url获取数据。但当“变更:年度”/“变更:季度”被解雇时,全球“变更”也被解雇

当然,如果我使用集合而不是模型的话——这是我的“重置”。但在这种情况下,我不能那么容易地听到“变化:年”——我必须再创建几个模型(针对年、季度和季度中的每个关键点)。但我想让应用程序保持简单

还有别的办法吗?或者创造更多的模型是不可避免的

谢谢

UPD:“更改”事件仍然需要,因为模型在获取新数据后必须重新提交


解决方案:我已经创建了一个公共控制器,它包含一个需要更改的属性。和in.url()方法从控制器获取它们以修改url。我坚持使用集合的fetch()/“reset”通知,并使控制器的侦听器处于“更改”状态。因此,当我更改“年”/“季度”时,查看从控制器获取的通知,以及相应的集合获取时-它使用新的url获取。

据我所知,如果仅
季度
更改,您不希望收到全局模型
更改
事件,但您必须这样做

因此,在获取接收全局更改事件时,您可以检查是否只有
季度
,并跳过正常的事件处理。大概是这样的:

this.model.bind("change", this.render, this);
this.model.bind("change:year", this.fetchSomething, this);
this.model.bind("change:quarter", this.fetchSomething, this); 

render : function(){
    var attributesExceptYearAndQuarter = _.without(this.model.attributes, ['year', 'quarter']) 
    if(this.model.changedAttributes(attributesExceptYearAndQuarter).length > 0){
         // do the rendering
    } 
}

您可以在模型的更改侦听器中检查更改的属性

var MyModel=Backbone.Model.extend({
    initialize:function(){
      this.bind("change",this.changeModel);
      this.bind("change:year",this.changeYear);

   },
   changeModel:function(model,objs){
      //Checking changed attributes
      if (_.has(objs.changes,"year") || _.has(objs.changes,"quarter")) return this;

     console.log("Processing",objs.changes);
     return this;
  },
   changeYear:function(model,new_val){
    console.log("year changed.",new_val);
    return this;
  }

});


var mymodel=new MyModel();
mymodel.set("year",2012); 
mymodel.set("month",6);
如果您有一个侦听模型的更改事件的视图,则应向模型添加不同的属性,并侦听该属性的更改事件,而不是模型的更改事件,并在该属性更改时渲染视图。在changeModel函数中更改此属性的值,如果您的“年”和“季度”属性不在更改的属性中,则触发侦听器,如下所示

//Edit changeModel as below
changeModel:function(model,objs){
          //Checking changed attributes
          if (_.has(objs.changes,"year") || _.has(objs.changes,"quarter")) return this;

          this.set("rerender",!this.rerender); //Changing for triggering change event
         return this;
      },


//View's constructor function
initialize:function(){
   this.model.bind("change:rerender",this.render);
}

您想在属性更改时不触发该模型的更改事件吗?谢谢您的帮助。但我已经找到了解决办法,它更适合我的需要。但我会把你的建议留到将来!谢谢你的时间和努力!这也是解决我问题的好办法。但我会坚持我的解决方案——它更适合我应用程序的整体逻辑。那么,如何解决这个问题,你能和我们分享吗?也许我们将来会遇到同样的问题。我已经在解决方案中描述过了。