仅当再次调用model.on时,Backbone.js model才会触发更改
这是我在这里的第一篇帖子,所以请友好一点;)我正在尝试创建一个主干+requireJS示例应用程序,我遇到了一个奇怪的问题。在我的视图初始化函数中,我通过事件绑定到模型更改仅当再次调用model.on时,Backbone.js model才会触发更改,backbone.js,requirejs,backbone-views,backbone-events,backbone-model,Backbone.js,Requirejs,Backbone Views,Backbone Events,Backbone Model,这是我在这里的第一篇帖子,所以请友好一点;)我正在尝试创建一个主干+requireJS示例应用程序,我遇到了一个奇怪的问题。在我的视图初始化函数中,我通过事件绑定到模型更改 this.model.on("change", this.change()); 事件在加载数据且一切正常时正确触发。在我看来,我还绑定到一个click事件。点击我试图改变其中一个属性,我希望有一个改变事件,但它从来没有来过 我在stackoverflow(,)上尝试了一些推荐的东西,但是运气不好 在我的内心深处,我觉得这与
this.model.on("change", this.change());
事件在加载数据且一切正常时正确触发。在我看来,我还绑定到一个click事件。点击我试图改变其中一个属性,我希望有一个改变事件,但它从来没有来过
我在stackoverflow(,)上尝试了一些推荐的东西,但是运气不好
在我的内心深处,我觉得这与事件绑定有关。当我再次尝试在单击回调时绑定到更改事件中的模型时,它开始工作。所以现在我坐在这里,嗯,我很困惑。有人能解释一下这个问题吗
我的看法是:
define(
[
'jquery',
'underscore',
'backbone',
'text!templates/news/newsListItem.html'
],
function($, _, Backbone, newsListItemTemplate)
{
var NewsListItemViewModel = Backbone.View.extend({
tagName: 'li',
events: {
"click a" : "onLinkClick"
},
initialize: function(){
this.model.on("change", this.changed());
},
render: function()
{
this.$el.html(_.template(newsListItemTemplate, this.model.toJSON()));
},
changed: function()
{
this.render();
console.log("changed");
},
//GUI functions
onLinkClick: function(e)
{
console.log("click!");
this.model.toggle();
this.model.on("change", this.changed());
}
});
var init = function(config){
return new NewsListItemViewModel(config);
}
return {
init : init
}
}
))
我的模型:
define(
['jquery', 'underscore', 'backbone'],
function($, _, Backbone){
var NewsListItemModel = Backbone.Model.extend({
toggle: function() {
this.set('done', !this.get('done'));
this.trigger('change', this);
}
});
var init = function(data)
{
return new NewsListItemModel(data);
}
return {
init: init,
getClass: NewsListItemModel
};
}
))
感谢您的输入:)首先,您应该将函数用作事件处理程序,而不是其结果。
因此,将该行更改为:
this.model.on("change", this.changed.bind(this));
现在,实际上只需启动一次this.changed()
函数,并将其结果(未定义的return
,因为该函数没有return
语句)指定为模型的change
事件处理程序
其次,您不应该在onLinkClick
中重新绑定此处理程序:一旦绑定,它将留在这里。看起来更适合触发此事件:
onLinkClick: function(e)
{
console.log("click!");
this.$el.toggle();
this.model.trigger('change');
}
谢谢,伙计,成功了!onLinkClick下的代码包含我的调试代码,重新绑定只是检查重新绑定是否有效的测试。我现在也一直在看,它们在init中绑定为fallows:this.listenTo(this.model,'change',this.render);这是绑定到模型的推荐方法吗?