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



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,按惯例一切工作)

和只有一个ViewModel:

  1. productEditor.js

现在,我想在productEditor.js中有一个函数,它将让我根据用户的角色决定插入哪个视图。我在合成文档中看到,我们可以做function strategy(settings) : promise,但我不确定在HotTowel模板中完成这一点的最佳方法是什么。有人试过并得到答案了吗?

在视图模型中返回'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.'
    };
});

你看了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' }
    }];

你可以使用相同的逻辑为这两个视图添加路由,然后在你的producteitor .js中,你可以使用router.navigateTo()方法来决定导航到哪个视图。

最新更新