我正在構建一個非常簡單的Marionette應用程序;我不使用Marionette.Module,因爲它已被棄用,並且因爲我想使用帶有Webpack的ES2015。MarionetteJS:誰負責顯示子應用程序?
我只有幾個「頁面」:一個是歡迎屏幕,另一個是遊樂場。這些頁面中的每一個都是Applications
,另外還有一個帶有Layout
的根應用程序,只有三個區域:頁眉,主頁和頁腳。
這些應用程序的視圖(或佈局)旨在填充根佈局的main
區域。
現在,無論何時我想展示其中一個子應用程序,我都不知道如何(或者,我沒有找到最滿意的方式)要求根視圖的showChildView
的佈局/這些子應用程序的佈局。
到目前爲止,我想出了兩種方法(其中沒有一個是太棒了):
編輯:我添加了另一種方法在Q
- 的每個控制器上的結束子應用程序,觸發事件「application:show」在視圖中傳遞。只要收到消息
- 每當我啓動一個子應用程序,我將它傳遞給根應用程序實例,根應用程序正在監聽此事件和
showChildView
。每當子應用程序需要顯示自己,它會調用main
區域
第一種方法是弱內showChildView
,因爲它是完全異步的(發射後不管)。我想知道什麼時候我的應用程序顯示(附加到DOM),但再次依賴另一個事件看起來很麻煩
第二種方法更強大,但它很糟糕,因爲我當然不希望子應用程序應用程序的視圖負責自己在根佈局中的呈現。根應用程序知道得更好。
一些代碼如下儘量展示兩個思路:
// Approach #1
// In the root app
welcomeApp.on('app:show', (view) => {
rootApp.rootView.showChildView('main', view);
});
// In the Welcome sub-app
var Controller = {
show() {
app.trigger('app:show', new WelcomeView());
}
};
// Approach #2
// In the root application
const welcomeApp = new WelcomeApp({
rootApp: this
});
// In the Welcome sub-app
var Controller = {
show() {
app.rootApp.rootLayout.showChildView('main', new WelcomeView());
}
};
編輯:1月12日
OK,挖一點,我發現我在想什麼的文檔中是正確的方法要做到這一點。這個想法是,根應用程序將偵聽來自子應用程序的命令。
所以,在我的根視圖,我將有:
this.channel.commands.setHandler("application:show", function(view) {
this.rootView.showChildView('main', view);
}.bind(this));
在所有其他的子應用,我會(例如,在WelcomeView):
getController() {
const greet = function() {
this.channel.commands.execute('application:show', new WelcomeView());
}.bind(this);
return {
greet: greet
};
}
這真是一個有趣的想法。我不知道Wires(感謝您的鏈接),我也沒有考慮使用服務。儘管如此,我仍然不確定他們是否能夠按照我已經佈置的方式來合適我的應用程序。我對Backbone非常有經驗,但我還沒有嘗試過Marionette,所以我甚至沒有考慮過Modules,因爲它們已經被棄用了。 我不喜歡通過無線電一起通話的「封裝」應用程序的想法。我們來看看我該如何使用這些服務! – Claudio
我不喜歡Wires的東西,現在我已經挖掘了一點,就是服務調用'this.container.show'方法,這正是我的問題的關鍵。我不喜歡「孩子」調用父母的方法......我知道它基本上與發送消息相同,但因爲一切都是基於事件的,所以這件事情讓我困擾:) – Claudio