Backbone.js 主干.js:“;超过最大调用堆栈大小;错误
假设我有一个模型和一个视图,该视图有两种方法:一种是绑定文档mousemove事件,另一种是unbind方法,如果我给文档mousemove事件,一旦模型的Backbone.js 主干.js:“;超过最大调用堆栈大小;错误,backbone.js,document,mousemove,Backbone.js,Document,Mousemove,假设我有一个模型和一个视图,该视图有两种方法:一种是绑定文档mousemove事件,另一种是unbind方法,如果我给文档mousemove事件,一旦模型的enable值更改,我将调用视图的unbind方法: window.ConfigModel = Backbone.Model.extend({ defaults: { 'enable':0 }, initialize: function(){
enable
值更改,我将调用视图的unbind方法:
window.ConfigModel = Backbone.Model.extend({
defaults: {
'enable':0
},
initialize: function(){
this.bind("change:enable", function () {
var portView2 = new PortView();
portView2.viewOff();
});
},
change:function () {
this.set('enable', 9);
}
})
window.PortView = Backbone.View.extend({
viewOn: function () {
$(document).on('mousemove', function () {
console.log('move')
})
},
viewOff: function () {
$(document).off('mousemove');
}
})
然后,我在文档上输入一个,以调用已更改的模型:
$('input').click(function () {
var configModel = new ConfigModel();
configModel.change();
})
启动脚本是:
var portView1 = new PortView();
portView1.viewOn();
问题是,一旦我调用单击输入按钮,chrome就会告诉我一个错误:超过了最大调用堆栈大小
似乎更改
被调用了很多次。那么我的问题是什么,我如何解决这个问题主干模型已经有一个:
更改model.change()
手动触发“更改”
事件,并为每个已更改的属性触发“更改:属性”
事件。如果您一直在将{silent:true}
传递给set函数,以便聚合对模型的快速更改,那么您需要在完成所有操作后调用model.change()
大概主干网内部有什么东西正在试图调用configModel.change()
并获取您的change
版本,这将触发另一个change()
调用主干网内部,该主干网运行您的change
。。。直到堆积如山
您应该为change
方法使用不同的名称
也就是说,您的代码结构有些奇怪。一个模型本身监听事件是很好的,但是一个模型创建一个视图是很奇怪的:
initialize: function() {
this.bind("change:enable", function () {
var portView2 = new PortView();
portView2.viewOff();
});
}
实例化一个视图只是为了调用一个方法,然后扔掉它,这和创建一个新模型只是为了触发一个事件一样奇怪
我认为您可能希望将单个ConfigModel实例作为应用程序状态的一部分,例如app.config
。然后您的单击
处理程序将与该模型对话:
$('input').click(function () {
app.config.enable_level_9(); // or whatever your 'change' gets renamed to
});
然后,应用程序的其他部分(不一定是视图)将侦听对app.config
的更改,并采取适当的行动:
app.viewOn = function() {
$(document).on('mousemove', function() {
console.log('move')
});
};
app.viewOff = function() {
$(document).off('mousemove');
};
app.init = function() {
app.config = new ConfigModel();
app.viewOn();
$('input').click(function () {
app.config.enable_level_9();
});
// ...
};
然后通过单个app.init()
调用启动应用程序:
$(function() {
app.init();
});
我已经更改了方法名称,第一个问题已经更改。但是另一个问题是:viewOff方法不工作,它无法解除文档的mousemove事件的绑定,我如何解决这个问题?使用console.log我可以看到该方法已被调用,但就是不能unbind@hh54188:重命名change
工作正常:您仍然有一个奇怪的应用程序结构,但它可以工作。