如何在一个对象的原型自动执行功能来自动运行JavaScript中所有的孩子吗?(How to hav

2019-09-28 02:08发布

父对象的每一个“孩子”需要被订阅的事件聚合固定事件:例如:

var dispatcher = EventAggregator.create();

有在应用程序的多个“若干意见”,所有意见必须订阅close事件。 使用主要成分:

Backbone.View.prototype.close = function(){
  //close logic
};

现在每个视图需要订阅的事件聚合即“close”事件var dispatcher ,而无需显式调用做到这一点的方法。 也就是说,不是不断说:

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

在每一个观点,即是Backbone.View的一个实例是有办法有自动订阅的所有观点close的调度事件?

难道是这样的工作:(似乎并不在我的情况,因为this被绑定到窗口:)

Backbone.View.prototype.subscribeClose: (function(){
 dispatcher.on('close',this.close);
})();

因为这将失败, this是必然的窗口。 这将是一个更好的方式来退出这个功能还是我必须手动调用父/原型方法,以确保订阅总是会发生? 是否有JS说我可能不知道的“另一个”的方式?

更新 :添加小提琴这两种观点应该触发“玉兰油”,但只有一个视图,其中subscribeOnClose添加到原型似乎是工作的罚款(试行按丹的答案)。 这两种观点都没有到触发响应,但。 只需用仿真模型中的触发器现在。

Answer 1:

更新

我不想把这个,除非真的有必要,但如果你真的希望这适用于所有视图的情况下,而不需要让他们从自己的自定义基本视图类下降,你可以尝试这样的事情(覆盖Backbone.View ,内置的基本视图类的构造函数):

http://jsfiddle.net/D9gR7/5/

$( document ).ready( function () {

  // Create your actual object here

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

  ( function () {

    var ctor = Backbone.View;

    Backbone.View = Backbone.View.extend( {

      constructor : function ( options ) {

        ctor.apply( this, arguments );

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

      },
      // constructor


      close : function () {

          console.log( this.cid );

      }
      // close

    } );

    Backbone.View.prototype.constructor = Backbone.View;

  } )();


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


  var views = [];

  var i;

  for ( i = 0 ; i < 10 ; ++i ) {

    views.push( new Backbone.View );

  }


  for ( i = 0 ; i < 10 ; ++i ) {

    views.push( new View );

  }

  dispatcher.trigger( 'close' );

} );

原来的答案

有你的代码一堆问题。 什么是这样的(参见控制台输出,很明显)? 我认为这是相当多的,你要去什么。 你只需要确保你调用父类initialize()当你重写子类中的方法。 另外,如果你想在某个时候完全吹走的观点的情况下,确保你调用dispatcher.off( null, null, view_instance )

http://jsfiddle.net/D9gR7/

$( 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);
    }
});


文章来源: How to have self-executing function in an object's prototype be auto-run for all children in JavaScript?