Backbone.listenTo 对比 this.listenTo

Backbone.listenTo vs this.listenTo

Backbone 对象(模型、视图、路由器)中,我们可以调用 this.listenTo

像这样

var BodyView = Backbone.View.extend({
  initialize: function() {
    this.listenTo(Backbone, 'prevent-scroll', this.preventScroll);
  },

  preventScroll: function(prevent) {
    // .prevent-scroll has the following CSS rule: overflow: hidden;
    this.$el.toggleClass('prevent-scroll', prevent);
  }
});

// And now from anywhere in the code:
Backbone.trigger('prevent-scroll', true); // prevent scrolling

但是,有没有办法使用

Backbone.listenTo,而不是this.listenTo?我没有在网上看到任何这样的例子,但我不明白为什么它不应该存在。

此外,通话中还有一个问题

Backbone.trigger('prevent-scroll', true);

true 参数被传递到哪里?我不明白

在 Javascript 中 this 是一个特殊的关键字,可以说它包含您当前正在使用的对象。

例如,

$("button").on("click",function(event){
console.log($(this));
})

这会将您单击的按钮的所有属性注销到控制台。

我也想看看回调。

你没有解释你需要它做什么,在特定 collect/view/model 实例的上下文之外使用 listenTo 是没有意义的。 listenTo 的全部要点是一个对象可以监听另一个对象(从自身内部)并 对该对象的销毁执行清理 ,以及将上下文绑定到 this.

例如在视图中 this.listenTo(this.model, ..)this.model.on(...) 好,因为当视图被销毁时,侦听器将被删除。

如果您不在该上下文中,则只需使用 .on 方法,它会做同样的事情。

var someModel = new Backbone.Model();
someModel.on('change:text', function(model, newValue) { ... }

如果您希望共享模型,您可以通过视图将其向下传递(如果您已将视图设置为具有层次结构)。或者像您的其他模板问题一样,您最好设置您的应用程序以使用 RequireJS。然后你可以有一个全局 AppState 模型,例如,它看起来像这样:

define([
    'backbone'
], function(Backbone) {

    var AppState = Backbone.Model.extend({

        ...

    });

    // Return as a singleton (instantiated).
    return new AppState();
});

这样每个其他组件都可能需要它,因为它是一个单例,它们都可以访问相同的模型并可以监听它的事件。

我正在查看带注释的 Backbone 来源。 http://backbonejs.org/docs/backbone.html#section-19

有一个明确的方法可以做到这一点。 天真的观点是,无论 Backbone 在哪里,您都应该能够在前端传递消息,而不仅仅是 Backbone.Views、Backbone.Models 等所在的任何地方。

如果你把这个放在你的前端,它会起作用:

    Backbone.Events.on('event1',function(msg){
        alert(msg);
     });

    Backbone.Events.trigger('event1','hiiii');

不仅如此,你还可以简单的做:

    Backbone.on('event1',function(msg){
            alert(msg);
     });

    Backbone.trigger('event1','hiiii');

这是因为 Backbone 来源中的这个调用:

_.extend(Backbone, Events);

Backbone.Events 是:

a module that can be mixed in to any object in order to provide it with custom events. You may bind with on or remove with off callback functions to an event; trigger-ing an event fires all callbacks in succession.

例如:

    var object = {};
    _.extend(object, Backbone.Events);
    object.on('expand', function(){ alert('expanded'); });
    object.trigger('expand');