2

初めてマリオネットで遊んでいます。ItemView を再レンダリングした後、それらのイベントがトリガーされませんでした。簡単な例:

App = new Marionette.Application;

App.addRegions({
    headerRegion: '#header',
    contentRegion: '#content',
});

App.addInitializer(function () {
    this.Views = {
        MainMenu : new MainMenuView(),
        ContentOne : new ContentOneView(),
        ContentTwo : new ContentTwoView(),
    };
});

App.addInitializer(function () {
    var self = this;
    var eva = self.vent;
    eva.listenTo(self.Views.MainMenu, 'content1', function () {
        self.contentRegion.show(self.Views.ContentOne);
    });
    eva.listenTo(self.Views.MainMenu, 'content2', function () {
        self.contentRegion.show(self.Views.ContentTwo);
    });
});

App.on('start', function () {
    var self = this;
    self.contentRegion.show(self.View.ContentOne);
});

App.start();

ContentOneView と ContentTwoView を再レンダリングした後、それらのイベントがトリガーされませんでした。私が間違っているのは何ですか?

4

3 に答える 3

5

あなたが抱えている問題は、region.show()現在その領域を占有しているビューを閉じようとしているということです。これを行うと、ビューのイベントの委任が解除されます。イニシャルの後、region.show()ビューで render を手動で呼び出す必要があります。

これについてはこちらで説明されており、問題についてはこちらで説明されています

于 2013-07-16T23:26:27.987 に答える
2

ビューがレイアウトに表示されているときにイベントを委任することで、この問題を解決できました。

layoutView.content.show(contentView);
contentView.delegateEvents();

Andrew Hubbs が述べたように、これは最初のレンダリング後にのみ必要ですが、

于 2013-10-02T14:36:40.213 に答える
1

ビューで発生するイベントをリッスンするために eva を使用する代わりに、他のビューから渡されたイベントを eva でリッスンしてみてください

App.addInitializer(function () {
    var eva = self.vent;
    var self = this;
    this.listenTo(eva, 'someStringHere', function(){/*do stuff here*/};
});

次に、ビューで eva/vent を介してイベントをトリガーできます

var eva = self.vent;
eva.trigger("someStringHere");
于 2013-07-17T02:07:15.627 に答える