Backbone.js 主干.js:“;超过最大调用堆栈大小;错误

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(){

假设我有一个模型和一个视图,该视图有两种方法:一种是绑定文档mousemove事件,另一种是unbind方法,如果我给文档mousemove事件,一旦模型的
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
工作正常:您仍然有一个奇怪的应用程序结构,但它可以工作。