2012-12-20 38 views
5

我仍在學習Extjs和mvc,所以我有一個設計問題,我確信有人可以爲我解答。我的問題是:Extjs4 mvc設計思路

我有2個控制器,處理兩個不同的意見。調用兩個控制器中的任何一個來根據用戶類型呈現正確的視圖。所以在我的情況下,如果用戶是管理員,那麼他們將獲得基於憑證的管理視圖,如果該人是標準用戶,則他們將獲得標準視圖。應該將決策邏輯放在app.js中,還是應該有另一個控制器來決定調用哪個控制器?

的一種方式,我想:

控制器管理

Ext.define('adminController', { 

     // handles admin 
}) 

控制器標準用戶

Ext.define('standardController', { 

     // handles standard 
}) 

App.js

Ext.application({ 
    name: 'MTK', 
    autoCreateViewport: true, 

    if(admin) { 
     controllers: ['adminController'] 
    } 
    else(std){ 
     controllers: ['standardController'] 
    } 
}); 

另一個想法:

控制器管理

Ext.define('adminController', { 

    // handles admin 
}) 

控制器標準用戶

Ext.define('standardController', { 

    // handles standard 
}) 

主控制器

Ext.define('mainController', { 

    if(admin){ 
     call adminController 
    } 
    else(std){ 
     call standardController 
    } 
}) 

回答

2

我不會做(或至少太多了),這在t中他前端。我想你應該能夠知道用戶登錄時的用戶角色。

對我來說,我這樣做,但我必須說我有一個更復雜的ACL,我不會打擾用戶模塊或視圖,後端將拒絕任何訪問。

我使用這兩種方法:

  • 重載/重定向到一個成功登錄後,應用程序視圖(後端!)。服務器知道用戶會話
  • 返回成功登錄巫後的配置包含的內容,要求未來的信息是什麼手背(這可能只是一個控制器或一些類)

這兩種方法的結果在更少的代碼,更快的加載和更容易的調試

我希望這指出你在正確的方向。

+0

我已經有一個登錄重定向到位。我想我應該已經提到過,但無論如何,我有一個會話,我獲得了用戶的LDAP信息。所以我想我可以使用另一個控制器來確定要呈現哪個視圖。 – reagan

+0

@rob當然你可以,但我不會在用戶角色或訪問前端控制器方面做出太多的決定。你應該在服務器端解決它們,正如我所說的登錄後重定向一個視圖,每個角色獲得setuped或返回rolenased信息到登錄 - cmp下載什麼 – sra

+0

感謝您的幫助 – reagan

2

有趣的問題,我同意@sra,它可能不是通過客戶端邏輯來做到這一點的正確方法,雖然它不是說它不會工作。

在我一直在努力的應用程序中,我們使用了定義所有控制器的方法,這些控制器可能會或可能不會在「導航」式控制器中調用。這是我們直接實例化的唯一一個,然後基於首先默認值,然後,我們選擇呈現適當的控制器和視圖的直接交互,就像第二種方法@sra所建議的那樣。

我認爲sra的第一種方法通常是合理的,但問題出現在您可能有一個視圖時,作爲管理員應該是可編輯的,而用戶應該只能讀取。在這種情況下,你不想寫兩個視圖。

我還沒有嘗試過的一件事(但這個問題讓我想要!)是返回一個稍微不同的基於服務器端邏輯的模型,如'用戶'或'readonlyuser'並彈出進入相同的視圖(以節省需要兩個視圖)或b)返回一個更復雜的模型,每個數據屬性伴隨着一個'可編輯'標誌。然後,這可以用於呈現不同的字段或應用程序中不同模式的字段.....我知道這並不回答這個問題,對您選擇的方法和任何您想要報告的結果感興趣!

+0

關於一種模式不同的輸出:其實我在我的第一部分這樣做,但它開始時有點複雜。但我可以告訴你,它的工作就像是一種魅力,而且開箱即可完全集成在ACL中 – sra

+0

從具體的實施POV中,您是如何選擇輸出模型的?也許一個模型帶有視圖響應的每個字段的「可編輯」標誌?或選擇屬性「名稱」(呈現爲文本框)和「只讀名稱」(呈現爲顯示字段?),視圖只是拾取它找到的字段? 我們在Ext中最常見的問題是在ro/rw模式下渲染視圖以及如何迎合這個問題,非常有興趣看到關於該主題的任何想法 – dougajmcdonald

+0

我會試着將它解釋得更詳細一點:我首先看看每個實體作爲一個模塊(前端作爲後端)。這意味着每個都至少有它自己的後臺控制器(有些只在前端有模型/存儲)。在數據下面,控制器還可以交回基於用戶ACL發生的前端類,並由緩存系統支持以減少加載時間。 ACL使得它成爲它的一部分,因爲它被設計爲易於由用戶主持(我就不需要配置任何東西)。這適用於延遲加載和完成應用程序加載。 – sra

0

我認爲正如sra正確指出的那樣,讓服務器向您發送有關登錄用戶類型的正確信息。在客戶端讓一個控制器決定要渲染哪個視圖。這應該是處理登錄頁面的相同控制器。 CARD VIEW是您可以用於此目的的佈局。在頁面呈現之後讓其他控制器照顧在該視圖中觸發的事件

而且任何方式控制器都不應該做渲染部分,這是視圖的工作 使用控制器僅用於對觸發的事件作出反應視圖