【问题标题】:HotTowel Durandal Inject different views based on the userHotTowel Durandal Inject 基于用户的不同视图
【发布时间】:2023-03-04 13:48:01
【问题描述】:

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

    <!--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 中有一个函数,它可以让我根据用户的角色决定插入哪个视图。我在Composition documentation 中看到,我们可以做function strategy(settings) : promise,但我不确定在 HotTowel 模板中实现此目的的最佳方法是什么。有人已经尝试过并得到答案吗?

【问题讨论】:

    标签: javascript durandal hottowel


    【解决方案1】:

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

    【讨论】:

    • 是的! Durandal 的创造者创造了一些很棒的东西!我不知道“viewUrl”实际上是按惯例用于在显示器上返回正确的视图。那很完美。我仍然想知道function strategy(settings):promise。我希望找到更多关于人们如何使用它的示例,但这非常适合我正在寻找的东西。谢谢@Rainer。
    • Nothing for strategy(settings):promise yet...,但是静态 viewUrl 属性还有另一种选择。 getView() 允许在更新 ko.observable 时查看 vm 更改。这是一个演示链接:spiritag.github.io/dFiddle-1.2-Q-and-A/#/view-composition/…
    【解决方案2】:

    您是否看过 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() 方法导航到该视图。

    【讨论】:

    • 是的,我不想在 Config.js 中添加两个视图。应该有一种更简单的方法来注入正确的视图,在 Durandal 中通过一个简单的函数调用。不需要添加额外的配置,否则如果我要引入更多角色(因此更多视图),我每次都必须复制配置条目。路线没有变化,都是一样的,只是角色不同的观点不同。
    • 我个人会使用 css 隐藏和显示功能来启用基于用户角色禁用部分 HTML 页面。因此,如果根据用户角色,页面的某些部分或组件是可见的,而其他部分是隐藏的,那么我将使用敲除绑定来隐藏或显示它们。这样我就必须只维护一个视图。但是,您想使用相同的视图模型并根据用户角色拥有不同的视图吗?您有什么理由要这样做而不是隐藏和显示页面的某些部分?
    • 是的,这适用于简单的事情,比如 John Papa 的伟大项目。但是当你在编写一个成熟的业务应用程序时,由于安全原因,有很多逻辑不应该与大家共享,所以仅仅因为它被隐藏了,内容仍然是可用的。所以我需要有一种正确的方法来为未经验证或允许的角色注入受限编辑模式视图。
    • 不能用cshtml文件代替普通html吗?在 CSHTML 中,您可以使用 if else 阻止这种方式,只有受限制的内容才会呈现给客户端,并且您的安全问题将得到解决。
    • Durandal 的设计考虑到了移动性,并且能够通过文件夹结构移动到 PhoneGap,我喜欢这种方法,所以我尽量远离 cshtml。这是一个 [链接](hhttp://bit.ly/ZLVrHj) 对其进行更多解释。我知道有一种简单而干净的方法可以接近它,但我还没有打开那扇门。
    猜你喜欢
    • 2013-05-30
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 2013-08-26
    • 1970-01-01
    • 2016-03-03
    相关资源
    最近更新 更多