Javascript HotTower Durandal根据用户情况注入不同的视图
在HotTower模板的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应用程序中的角色注入不同的视图。例如 我有
shell.html
中,我们有:
<!--ko compose: {model: router.activeItem,
afterCompose: router.afterCompose,
transition: 'entrance'} -->
<!--/ko-->
它将按约定自动插入正确的视图。我正在尝试根据用户在HotTower/Durandal应用程序中的角色注入不同的视图。例如
我有两种看法,
现在,我想在
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.'
};
});