Knockout.js Durandal应用程序中的单独登录视图

Knockout.js Durandal应用程序中的单独登录视图,knockout.js,durandal,durandal-2.0,durandal-navigation,Knockout.js,Durandal,Durandal 2.0,Durandal Navigation,my Durandal应用程序的DOM结构如下: //shell.html 这是我的路由器配置的一个片段 router.map([ {路由:“”,模块ID:'viewmodels/dashboard',名称:'dashboard'}, {route:'form',moduleId:'viewmodels/form',name:'form'}, {route:'login',moduleId:'viewmodels/login',name:'login'} ]); 正如您所看到的,我的登录视图

my Durandal应用程序的DOM结构如下:

//shell.html
这是我的路由器配置的一个片段

router.map([
{路由:“”,模块ID:'viewmodels/dashboard',名称:'dashboard'},
{route:'form',moduleId:'viewmodels/form',name:'form'},
{route:'login',moduleId:'viewmodels/login',name:'login'}
]);
正如您所看到的,我的登录视图被插入到
中,这是预期的行为。但是,如果我在登录视图上,我需要隐藏标题视图,这是我通过订阅标题视图模型中的路由器配置来实现的:

router.activeInstruction.subscribe(函数(val)){
val.config.name==“登录”?showHeader(false):showHeader(true);
});
但是这感觉有点混乱,DOM对于标题视图仍然在页面中,我真正想做的是,如果我在登录视图中,我只希望登录视图的DOM在那里,就好像我在只有登录视图的单独页面中一样。但到目前为止,我还没有找到一个干净的方法来做这件事。

有几件事:

  • 安全的最终责任永远不在前端。您在前端“关闭”的所有内容都很容易被恶意用户访问。后端应该保护您的所有功能和数据,前端只是隐藏它以给用户更好的体验。因此,换句话说,它是否仍在DOM中并不重要(从安全角度来看)。即使不是,也不会更安全
  • 如果您不想在DOM中使用节点(出于性能原因),请使用
    如果
    -绑定。如果情况不好,他们会把里面的东西藏起来
  • activeInstruction上的订阅确实有点混乱。你需要改进你的逻辑。标头不会因为用户在登录页上而隐藏,标头会因为用户未登录而隐藏。这是一个很大的区别。你所做的基本上是一个肮脏的黑客。在shell viewmodel(或其他地方)中有一个可观察/计算可观察,返回用户是否经过身份验证。然后在此基础上,显示/隐藏标题
  • 使用我上面提到的经过验证的可观察对象,您还可以通过检查该可观察对象来“保护”您的视图。这样,您就可以确保用户无法导航到需要对其进行身份验证的路由。不过,这种安全检查的最终责任还是在后端,而不是前端
  • 编辑
    我可以理解你为什么想要一个完全不同的“布局”,而不需要登录视图的DOM的其余部分。但这与单页应用程序的整体理念背道而驰。这也是不必要的。一点聪明的css和数据绑定(可视,如果有)将给你同样的结果,通常提供比完整页面重新加载更好的用户体验。如果您坚持要破坏SPA,请将路由器降低一级:例如,主路由器只知道登录路由和内部路由。内部路由有另一个路由器,它保存所有其他页面。通过这种方式,您可以将通用HTML从shell视图移动到内部视图。

    感谢您回答这个问题。标题是特定于演示文稿的,因此从安全角度来看,我很高兴。我遇到的问题是,最初呈现登录页面时出现了闪烁。但是我理解你用visible和if绑定和订阅来检查用户是否登录并显示标题的意思。我会试试看。我的意思是,我会保持这个问题的开放性,以防其他人有不同的做法。看起来我只是需要把逻辑正确,一切都安排妥当。谢谢