2012-12-23 59 views
1

我想为事件实现一个简单的中介模式,但是当我使用中介注册时,我的事件回调被调用。骨干事件回调被绑定时调用,而不是被触发

中保很简单:

define(function(require){ 
    'use strict'; 
    var _ = require('underscore'); 
    var Backbone = require('backbone'); 

    return _.extend(Backbone.Events); 
}); 

我已创建了没有后盾的模型或模板简单查看

define(function (require) { 

'use strict'; 

var Backbone = require('backbone'); 
var mediator = require('mediator'); 

var Sandbox = Backbone.View.extend({ 

    el: '.sandbox', 
    initialize: function() { 
     this.render(); 
     this.bindEvents(); 
    }, 

    bindEvents:function(){ 
     mediator.on("sandbox:change", this.changeText(), this); 
    }, 

    render: function() { 
     $(this.el).html("SANDBOX VIEW IS WORKING"); 
    }, 

    changeText: function() { 
     $(this.el).html("THE TEXT HAS CHANGED"); 
    } 
}); 

return Sandbox; 

}); 

当视图被加载,sandbox:change事件被触发关闭,changeText函数被调用,即使没有任何东西叫mediator.trigger('sandbox:change')

为什么回调时,它只是简单地绑定到介体对象?

+6

因为你的代码调用'this.changeText()'并且告诉骨干绑定*调用的结果*。你想要的是mediator.on(“sandbox:change”,this.changeText,this)'(注意不存在'()')。 – DCoder

+0

啊!我看到瞎子说...谢谢! – Mars

回答

0

当浏览器评估您的沙箱变更事件绑定mediator.on("sandbox:change", this.changeText(), this);时,正在执行changeText函数,因为包含()。你真正想要做的是changeText函数对象传递给事件绑定:

mediator.on("sandbox:change", this.changeText, this); 

记住changeText,是一个对象,是您的视图中的一员。

var Sandbox = Backbone.View.extend({ 
    ... 
     changeText: function() {...} 
    }); 

当您想执行该功能时,请使用括号。当你想引用该对象时,省略括号。