1

我了解自定义事件在 Backbone 中的工作原理以及如何触发它们,但我无法理解何时准确使用它们以及它们的用途是什么,而不是直接调用函数。

例如

var MyView = Backbone.View.extend({
    tagName: 'div',
    className: 'myview',

    initialize: function() {
        this.model.on("mycustomevent", this.doSomething, this);
    },

    doSomething: function() { 
         console.log('you triggered a custom event');
    }

});

如果我没记错的话,doSomething方法可以 this.model.trigger("mycustomevent")在其他方法中使用,也可以直接使用this.doSomething()

在视图之外,它可以类似地调用

var myview = new MyView({model:somemodel});

myview.model.trigger("customevent");

myview.doSomething();

我感到困惑的是为什么不放弃自定义事件而在需要时直接调用该方法?任何示例使用将不胜感激!

4

2 回答 2

6

您可能希望在代码 f.ex 的不同位置添加多个处理程序:

this.model.on("mycustomevent", this.doSomething, this);

// ... and somewhere else you add an anonymous function
this.model.on("mycustomevent", function() {
    console.log('do something');
});

然后当您触发事件时,它将执行所有处理程序。您还可以off用于取消绑定/管理单个或多个处理程序。

如果您询问事件模式的一般解释(也称为观察者模式发布/订阅等),您可能应该寻找更深入的文章或书籍。

于 2012-11-26T22:19:58.883 回答
1

使用骨干网,完美的例子是改变模型的属性。使用一个函数,你将不得不做这样的事情......

$( '#someUI' ).click( function {
   // update the model property
   myModel.someProperty = 'somethingDifferent';
   // update any ui that depends on this properties value
   $( '#uiThatDisplaysModelData' ).find( 'someSelector' ).html( 'somethingDifferent' );
   // save the model change to the server
   $.ajax( {
      url: 'somesaveurl',
      data: { someProperty: 'somethingDifferent' }
      success: callback
   } );
} );

然后针对每个属性更改在整个代码中重复这些步骤。

通过骨干网和一些设置,可以通过以下方式完成相同的事情:

myModel.set( 'property', 'somethingDifferent' );

这是因为我们已将处理程序附加到此模型的changechange:property事件。这些是由主干为模型自动创建的自定义事件。因此,每当您的代码的任何部分操作模型时,DOM 更新和保存都可以自动完成。我们还可以将输入验证或我们想要的任何内容绑定到这些自定义事件。

它基本上只是将观察者模式应用于您的应用程序,其中事件属于可观察的对象,处理程序属于其观察者。

http://en.wikipedia.org/wiki/Observer_pattern

于 2012-11-26T23:08:00.113 回答