2

ルーター オブジェクトで、ビュー間で共有するイベント オブジェクトを作成しました

イベント オブジェクトをビューに渡します

この共有オブジェクトにイベントを次のように登録します

var productCatalogView = Backbone.View.extend({
      initialize: function (options) {
                     //bind alert event to sharedEvents
                    options.sharedEvents.bind("alert", this.alert,this);
                },
      alert: function () {
                    alert('alerted');
                }
    });

//次のビューはアラート イベントをトリガーします

 var testView = Backbone.View.extend({

            initialize: function (options) {
                this.sharedEvents = options.sharedEvents;
            },
            events: {
                 'click #test': 'triggerAlert'
            },

            triggerAlert: function (e) {
                this.sharedEvents.trigger("alert", null);

            }           

        });

問題: 私が経験する問題は、アラート イベント (2 番目のビュー) をトリガーするボタンを初めてクリックしたときに、アラート イベントが 1 回呼び出される (良い) ことです。検索パラメーターを渡すルート、したがって最初のビューを作成し、sharedEvents を再度バインドするため、アラートイベントを 2 回トリガーすると、2 回トリガーされ (悪い)、次に同じプロセスを繰り返すと、3 回トリガーされます。などなど。最初のビューのイベントバインディングに関係していると思います。つまり、ビューが初期化されるたびに(私が正しい場合)、イベントのバインディングを1回発生させるにはどうすればよいですか。

ビューを初期化する方法を示すルーターは次のとおりです。

var Router = Backbone.Router.extend({

    sharedEvents:_.extend({},Backbone.Events),

    catalog: function (id) {

       //....unecessary code left out

        var productView = new ProductView({sharedEvents:this.sharedEvents});

            this.renderView(productView);
            this.renderView(new testView({sharedEvents: this.sharedEvents }));
       }

      renderView: function (view) {
                if (null != this.currentView) {
                    this.currentView.undelegateEvents();
                    // this.currentView.remove();
                }
                this.currentView = view;
                this.currentView.render();
            }

});

私はこの解決策を試しましたが、問題は解決しません、ありがとう

4

1 に答える 1