HotTowel Durandal根据用户注入不同的视图

时间:2013-05-09 21:23:24

标签: javascript durandal hottowel

shell.html for HotTowel模板中,我们有:

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

将按惯例自动插入正确的视图。我试图根据用户在HotTowel / Durandal应用程序中的角色注入不同的视图。例如, 我有两个观点,

  1. productEditor_Admin.html
  2. productEditor_Superviser.html (而不是这两个视图,我以前只有productEditor.html,按照惯例一切正常)
  3. 并且只有一个ViewModel:

    1. productEditor.js
    2. 现在,我希望在productEditor.js中有一个函数,让我根据用户的角色决定插入哪个视图。我在Composition documentation中看到,我们可以function strategy(settings) : promise,但我不确定在HotTowel模板中完成此操作的最佳方法是什么。有人已经试过并得到了答案吗?

2 个答案:

答案 0 :(得分:3)

可以返回一个&#39; viewUrl&#39;在视图模型中的属性,所以希望像下面这样的东西会打开门; - )。

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.'
    };
});

答案 1 :(得分: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()方法导航和导航到哪个视图。