如何在对象';在JavaScript中,是否为所有子级自动运行原型?

如何在对象';在JavaScript中,是否为所有子级自动运行原型?,javascript,backbone.js,Javascript,Backbone.js,父对象的每个“子”都需要订阅事件聚合器中的固定事件:例如: var dispatcher = EventAggregator.create(); 应用程序中有多个“视图”,所有视图都必须订阅关闭事件。使用主干网: Backbone.View.prototype.close = function(){ //close logic }; 现在,每个视图都需要订阅事件聚合器上的“关闭”事件,即var dispatcher,而无需显式调用方法来完成此操作。而不是不断地说: dispatcher.

父对象的每个“子”都需要订阅事件聚合器中的固定事件:例如:

var dispatcher = EventAggregator.create();
应用程序中有多个“视图”,所有视图都必须订阅关闭事件。使用主干网:

Backbone.View.prototype.close = function(){
  //close logic
};
现在,每个视图都需要订阅事件聚合器上的“关闭”事件,即
var dispatcher
,而无需显式调用方法来完成此操作。而不是不断地说:

dispatcher.on('close',this.close)
ParentView.prototype.somethod.apply()

在作为主干实例的每个视图中。视图是否有一种方法可以让所有视图自动订阅dispatcher上的
close
事件

可以这样做吗:(在我的情况下似乎不是这样,因为
被绑定到窗口:)

此操作失败,因为此已绑定到窗口。有什么更好的方法来实现这一点,或者我必须手动调用父/原型方法来确保订阅总是发生?JS中是否有我可能不知道的“另一种”方式

更新:在“玉兰油”上添加两个视图都会触发,但只有一个视图将
subscribeOnClose
添加到原型中,似乎工作正常(根据Dan的回答进行了实验)。不过,两个视图都不对触发器作出响应。现在只是用模型模拟触发器。

更新 除非真的有必要,否则我不想将其显示出来,但是如果您真的想将其应用于所有视图实例,而不需要让它们从您自己的自定义基本视图类中派生出来,您可以尝试类似的方法(覆盖
主干.view
,内置的基本视图类构造函数):

示例代码中的一些问题:

var V1 = Backbone.View.extend({

    // JMM: If you pass `el` to `extend()`, any instances you create
    // from the class will be tied to the same DOM element, unless
    // you pass a different `el` to the view constructors. Maybe
    // that's what you want.

    el: '#MyDiv',

    initialize: function() {
        var self = this;

        // JMM: You're assigning `undefined` to this prototype
        // property. And you're trying to register the
        // return value of self.alert() (`undefined`) as
        // the handler for the `olay` event.

        Backbone.View.prototype.subOnClose = (function(){
            model.on('olay',self.alert('olay'));
        })();
    },

    alert: function(s) {
        alert('V1 -->' + s);
    }
});
更新 除非真的有必要,否则我不想将其显示出来,但是如果您真的想将其应用于所有视图实例,而不需要让它们从您自己的自定义基本视图类中派生出来,您可以尝试类似的方法(覆盖
主干.view
,内置的基本视图类构造函数):

示例代码中的一些问题:

var V1 = Backbone.View.extend({

    // JMM: If you pass `el` to `extend()`, any instances you create
    // from the class will be tied to the same DOM element, unless
    // you pass a different `el` to the view constructors. Maybe
    // that's what you want.

    el: '#MyDiv',

    initialize: function() {
        var self = this;

        // JMM: You're assigning `undefined` to this prototype
        // property. And you're trying to register the
        // return value of self.alert() (`undefined`) as
        // the handler for the `olay` event.

        Backbone.View.prototype.subOnClose = (function(){
            model.on('olay',self.alert('olay'));
        })();
    },

    alert: function(s) {
        alert('V1 -->' + s);
    }
});

这是最简单的方法:)是的,我知道如何做到这一点,这不是我所要求的。我总是可以调用父方法。我要求的是“自动”发生的事情,而不必为应用程序中的每个视图调用父方法。您是指每个视图实例,还是通过调用
extend()
创建的每个视图类?每个视图实例都必须订阅“close”,因此将在其类中的某个位置定义。在问题中明确说明并更新了w.r.t.您的答案:)那么,按照我的答案中的建议,从基类创建所有视图实例是一种选择,还是它们都必须是主干网的直接实例。视图?使用我在回答中建议的技术,在创建视图实例时不需要显式调用任何东西。只要您从
视图中实例化它们
我定义的类,它们就会被注册以侦听事件。你的问题不是很清楚,从你的代码判断,我不能对你的能力有太多假设。在这种情况下,我真的不认为你应该这么快就投反对票。我确实要问“有没有可能在不调用父类方法或显式订阅它的情况下关闭我所有的视图”-我是否可以对自动执行函数采取“技巧”来确保它们“始终绑定”这是最简单的方法:)是的,我知道如何做到这一点,而这不是我所要求的。我总是可以调用父方法。我要求的是“自动”发生的事情,而不必为应用程序中的每个视图调用父方法。您是指每个视图实例,还是通过调用
extend()
创建的每个视图类?每个视图实例都必须订阅“close”,因此将在其类中的某个位置定义。在问题中明确说明并更新了w.r.t.您的答案:)那么,按照我的答案中的建议,从基类创建所有视图实例是一种选择,还是它们都必须是主干网的直接实例。视图?使用我在回答中建议的技术,在创建视图实例时不需要显式调用任何东西。只要您从
视图中实例化它们
我定义的类,它们就会被注册以侦听事件。你的问题不是很清楚,从你的代码判断,我不能对你的能力有太多假设。在这种情况下,我真的不认为你应该这么快就投反对票。我确实要问“有没有可能在不调用父类方法或显式订阅它的情况下关闭我所有的视图”-我是否可以对自动执行函数采取“技巧”来确保它们“始终绑定”我不需要手动操作。
$( document ).ready( function () {

  // Create your actual object here

  var dispatcher = _.clone( Backbone.Events );

  var View = Backbone.View.extend( {

    initialize : function ( options ) {

      dispatcher.on( 'close', this.close, this );

    },


    close : function () {

      console.log( this.el.id );

    }

  } );


  var Some_Kind_Of_View = View.extend( {

    initialize : function ( options ) {

      View.prototype.initialize.apply( this, arguments );

      // ...

    }

  } );


  var view1 = new View( {

    el : $( "#MyDiv" )[0],

  } );


  var view2 = new Some_Kind_Of_View( {

    el : $( "#MyDiv2" )[0]

  } );


  dispatcher.trigger( 'close' );

} );
var V1 = Backbone.View.extend({

    // JMM: If you pass `el` to `extend()`, any instances you create
    // from the class will be tied to the same DOM element, unless
    // you pass a different `el` to the view constructors. Maybe
    // that's what you want.

    el: '#MyDiv',

    initialize: function() {
        var self = this;

        // JMM: You're assigning `undefined` to this prototype
        // property. And you're trying to register the
        // return value of self.alert() (`undefined`) as
        // the handler for the `olay` event.

        Backbone.View.prototype.subOnClose = (function(){
            model.on('olay',self.alert('olay'));
        })();
    },

    alert: function(s) {
        alert('V1 -->' + s);
    }
});