Backbone.js 主干应用程序的结构。模型/收集问题
我的应用程序的逻辑非常简单。我有一个获取JSONP的模型(数据包含年份、季度,季度包含不同的键:value)。获取数据后,View会侦听模型的“更改”事件,然后呈现数据。到目前为止还不错 但接下来我需要监听“change:year”/“change:quarter”,并根据更改使用新的url获取数据。但当“变更:年度”/“变更:季度”被解雇时,全球“变更”也被解雇 当然,如果我使用集合而不是模型的话——这是我的“重置”。但在这种情况下,我不能那么容易地听到“变化:年”——我必须再创建几个模型(针对年、季度和季度中的每个关键点)。但我想让应用程序保持简单 还有别的办法吗?或者创造更多的模型是不可避免的 谢谢 UPD:“更改”事件仍然需要,因为模型在获取新数据后必须重新提交Backbone.js 主干应用程序的结构。模型/收集问题,backbone.js,Backbone.js,我的应用程序的逻辑非常简单。我有一个获取JSONP的模型(数据包含年份、季度,季度包含不同的键:value)。获取数据后,View会侦听模型的“更改”事件,然后呈现数据。到目前为止还不错 但接下来我需要监听“change:year”/“change:quarter”,并根据更改使用新的url获取数据。但当“变更:年度”/“变更:季度”被解雇时,全球“变更”也被解雇 当然,如果我使用集合而不是模型的话——这是我的“重置”。但在这种情况下,我不能那么容易地听到“变化:年”——我必须再创建几个模型(针
解决方案:我已经创建了一个公共控制器,它包含一个需要更改的属性。和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);
}
您想在属性更改时不触发该模型的更改事件吗?谢谢您的帮助。但我已经找到了解决办法,它更适合我的需要。但我会把你的建议留到将来!谢谢你的时间和努力!这也是解决我问题的好办法。但我会坚持我的解决方案——它更适合我应用程序的整体逻辑。那么,如何解决这个问题,你能和我们分享吗?也许我们将来会遇到同样的问题。我已经在解决方案中描述过了。