Javascript HotTower Durandal根据用户情况注入不同的视图

Javascript HotTower Durandal根据用户情况注入不同的视图,javascript,durandal,hottowel,Javascript,Durandal,Hottowel,在HotTower模板的shell.html中,我们有: <!--ko compose: {model: router.activeItem, afterCompose: router.afterCompose, transition: 'entrance'} --> <!--/ko--> 它将按约定自动插入正确的视图。我正在尝试根据用户在HotTower/Durandal应用程序中的角色注入不同的视图。例如 我有

在HotTower模板的
shell.html
中,我们有:

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

它将按约定自动插入正确的视图。我正在尝试根据用户在HotTower/Durandal应用程序中的角色注入不同的视图。例如 我有两种看法,

  • productEditor_Admin.html
  • productEditor\u Superviser.html (根据惯例,我以前只有productEditor.html,而不是这两个视图)
  • 并且只有一个ViewModel:

  • productEditor.js

  • 现在,我想在
    productEditor.js
    中有一个函数,让我根据用户的角色决定插入哪个视图。我在中看到,我们可以执行
    功能策略(设置):承诺
    ,但我不确定在HotTower模板中实现这一点的最佳方法是什么。有人已经试过了并得到了答案吗

    你看过约翰·帕帕在PluralSight上的跳转课程了吗

    请在此处查看该应用程序的源代码:

    在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' }
        }];
    
    var路由=[{
    url:'会话',
    moduleId:“视图模型/会话”,
    名称:“会话”,
    可见:对,
    标题:"会议",,
    设置:{标题:“会话”}
    }, {
    网址:'演讲者',
    moduleId:“视图模型/扬声器”,
    姓名:'发言者',
    描述:“发言者”,
    可见:对,
    设置:{caption:'Speakers'}
    }, {
    url:'sessiondetail/:id',
    moduleId:'viewmodels/sessiondetail',
    名称:“编辑会话”,
    标题:“编辑会话”,
    可见:假
    }, {
    url:'sessionadd',
    moduleId:'viewmodels/sessionadd',
    名称:“添加会话”,
    可见:假,
    标题:“添加会话”,
    设置:{admin:true,标题:“添加会话”}
    }];
    

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

    可以在视图模型中返回“viewUrl”属性,因此希望类似于以下内容的内容会打开该门;-)


    是的,我不想在Config.js中添加两个视图。在Durandal中,应该有一种更简单的方法通过简单的函数调用注入适当的视图。不需要添加额外的配置,否则如果要引入更多的角色(因此需要更多的视图),每次都必须复制配置条目。路由没有改变,它是一样的,只是视图根据角色的不同而不同。我个人会使用css隐藏和显示功能来根据用户角色禁用HTML页面的某些部分。因此,如果根据用户角色,页面的某些部分或组件是可见的,而其他部分是隐藏的,那么我将使用淘汰绑定来隐藏或显示它们。这样,我将不得不只维护一个视图。但是,是否希望使用相同的viewmodel,并根据用户角色使用不同的视图?你为什么要这样做,而不是隐藏和显示页面的某些部分?是的,对于简单的事情来说,这是正确的,比如约翰·帕帕的伟大项目。但是,当您编写一个全面的业务应用程序时,由于安全原因,有许多逻辑不应该与所有人共享,因此,仅仅因为它是隐藏的,内容仍然可用。因此,我需要有一个适当的方法,为未经验证或不允许的角色注入受限编辑模式视图。您不能使用cshtml文件而不是普通html吗?在CSHTML内部,你可以使用if-else块,这样只有受限内容才会呈现给客户端,你的安全问题也会得到解决。Durandal的设计考虑到了移动性,能够使用文件夹结构移动到PhoneGap,我喜欢这种方法,所以我尽量远离CSHTML。这里有一个[链接](hhttp://bit.ly/ZLVrHj)多解释一下。我知道有一个简单而干净的方法来接近它,但我还没有打开那扇门。是的!杜兰达尔的创造者创造了一些令人敬畏的东西!我不知道“viewUrl”实际上被惯例用来在显示器上返回正确的视图。太好了。我仍然想知道
    功能策略(设置):promise
    。我希望能找到更多关于人们如何使用它的样本,但这正是我想要的。谢谢@Rainer.Nothing for strategy(settings):承诺还没有…,但是静态viewUrl属性还有第二种选择。getView()允许在更新ko.observable时查看vm更改。以下是演示的链接:
    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.'
        };
    });