2013-05-09 27 views
1

HotTowel迪朗達爾進樣不同的看法在shell.html爲HotTowel模板,我們有:基於用戶

<!--ko compose: {model: router.activeItem, 
     afterCompose: router.afterCompose, 
     transition: 'entrance'} --> 
    <!--/ko--> 

,它會自動插入按照慣例適當的視圖。我正在嘗試根據用戶在HotTowel/Durandal應用程序中的角色注入不同的視圖。例如, 我有兩個意見,

  1. productEditor_Admin.html
  2. productEditor_Superviser.html (而不是上述兩種觀點,我以前只有productEditor.html,按照慣例一切工作)

和僅單個視圖模型:

  1. productEditor.js

現在,我想在productEditor.js中有一個函數,讓我根據用戶的角色決定插入哪個視圖。我在Composition documentation中看到,我們可以做function strategy(settings) : promise,但我不確定在HotTowel模板中完成此操作的最佳方法是什麼。任何人都已經嘗試過並得到了答案?

回答

3

有可能在視圖模型中返回一個'viewUrl'屬性,所以希望下面的東西能打開門;-)。

define(function() { 
    viewUrl = function() { 
     var role = 'role2'; //Hardcoded for demo 

     var roleViewMap = { 
      'default': 'samples/viewComposition/dFiddle/index.html', 
      role1: 'samples/viewComposition/dFiddle/role1.html', 
      role2: 'samples/viewComposition/dFiddle/role2.html' 
     }; 

     return roleViewMap[role]; 

    } 

    return { 
     viewUrl: viewUrl(), 
     propertyOne: 'This is a databound property from the root context.', 
     propertyTwo: 'This property demonstrates that binding contexts flow through composed views.' 
    }; 
}); 
+0

是的!杜蘭達的創造者已經取得了令人敬畏的成就!我不知道'viewUrl'是否被慣例用來在顯示屏上返回正確的視圖。那很完美。我仍然想知道'功能策略(設置):諾言'。我希望能找到更多關於人們如何使用它的示例,但這對於我所期待的是完美的。謝謝@Rainer。 – aminjam 2013-05-10 14:29:54

+0

沒有什麼策略(設置):承諾尚未...,但有第二個替代靜態viewUrl屬性。當更新ko.observable時,getView()允許更改虛擬機的視圖。以下是演示的鏈接:http://spiritag.github.io/dFiddle-1.2-Q-and-A/#/view-composition/getView – RainerAtSpirit 2013-05-10 21:12:47

0

你看過John Papa在PluralSight上的JumpStart課程嗎?

看從這裏應用程序的源代碼:https://github.com/johnpapa/PluralsightSpaJumpStartFinal

在app/Config.js文件他補充道等航線它是可見的默認情況下爲:

var routes = [{ 
     url: 'sessions', 
     moduleId: 'viewmodels/sessions', 
     name: 'Sessions', 
     visible: true, 
     caption: 'Sessions', 
     settings: { caption: '<i class="icon-book"></i> Sessions' } 
     }, { 
     url: 'speakers', 
     moduleId: 'viewmodels/speakers', 
     name: 'Speakers', 
     caption: 'Speakers', 
     visible: true, 
     settings: { caption: '<i class="icon-user"></i> Speakers' } 
     }, { 
     url: 'sessiondetail/:id', 
     moduleId: 'viewmodels/sessiondetail', 
     name: 'Edit Session', 
     caption: 'Edit Session', 
     visible: false 
    }, { 
     url: 'sessionadd', 
     moduleId: 'viewmodels/sessionadd', 
     name: 'Add Session', 
     visible: false, 
     caption: 'Add Session', 
     settings: { admin: true, caption: '<i class="icon-plus"></i> Add Session' } 
    }]; 

可以路由添加到兩這裏的視圖使用相同的邏輯,然後在您的productEditor.js中,您可以決定使用router.navigateTo()方法導航到哪個視圖並導航到該視圖。

+0

是的,我不想在Config.js中添加兩個視圖。在Durandal中通過簡單的函數調用應該有一種更簡單的方法來注入適當的視圖。沒有必要添加額外的配置,否則如果我要引入更多的角色(因此更多的視圖),我將不得不每次複製配置條目。路線不是chaning,它是相同的,只是基於角色的視圖是不同的。 – aminjam 2013-05-10 00:42:12

+0

我會親自使用css hide and show功能來根據用戶角色啓用我的HTML頁面的禁用部分。所以,如果取決於用戶角色的某些部分或組件頁面是可見的,其他隱藏,那麼我將使用敲除綁定來隱藏或顯示它們。這樣我將不得不保持唯一的視圖。 但是,您希望使用相同的viewmodel並根據用戶角色擁有不同的視圖?任何你想這樣做的原因,而不是隱藏和顯示你的網頁的一部分? – Yogesh 2013-05-10 00:54:01

+0

對,簡單的事情就是如此,就像John Papa的偉大計劃一樣。但是當你寫一個完整的業務應用程序時,由於安全原因,有很多邏輯不應該與所有人共享,所以只是因爲它隱藏了,內容仍然可用。所以我需要有一個適當的方式來爲未經驗證或允許的角色注入受限制的編輯模式視圖。 – aminjam 2013-05-10 01:15:30