【发布时间】:2014-05-31 15:19:16
【问题描述】:
我正在尝试通过检查模块的状态(用户登录的帐户类型)来制作 Durandal 应用程序(使用 Knockout 的 SPA 框架)的正文元素。在应用程序外壳的视图模型中,我有以下代码:
function bindingComplete() {
viewhelper.accountVisualTreatment();
}
而accountVisualTreatment 是在viewhelper 模块中定义的:
if (typeof(appsecurity.userInfo()) == 'undefined') {
$("body").addClass("notloggedin");
$(".container").addClass("notloggedin");
} else {
if (appsecurity.isUserInRole(['Account Manager']) && !appsecurity.isUserInRole(['Administrator'])) {
$("body").addClass("accountmanager");
$("nav").addClass("hidden");
} else {
$("body").removeClass();
$(".container").removeClass("notloggedin");
$("nav").removeClass("hidden");
}
}
如果我以差异帐户类型登录时刷新页面,一切正常。但是作为一个 SPA 框架,在使用时没有页面刷新。因此,这些课程并没有按照我的意愿应用。如何使 body、container 和 nav 元素的类按我的意愿绑定?
编辑:我尝试在不同帐户类型的登录页面的视图模型中调用 viewhelper.accountVisualTreatment(),但无济于事。仍然需要刷新页面。
编辑:我通过在我的 shell.html 中将 css 绑定应用到容器 div 来丑陋地修复它
<div class="container" data-bind="css: viewhelper.accountVisualTreatment()"> ... </div>
【问题讨论】:
-
您的代码只在文档加载时运行一次,这就是为什么永远不会应用这些类的原因。你的答案肯定是在正确的轨道上。您绝对可以使用这样的帮助程序,或者如果您希望在标记中直接使用
css: { 'notloggedin': appsecurity.userInfo() == 'undefined' }之类的条件绑定 -
不确定我是否理解这个问题......淘汰赛绑定的全部目的是让您的页面动态而不需要刷新页面。您只需将可见性或 css 或任何东西绑定到可观察对象,当可观察对象发生时,您的页面就会更改。
-
我正在尝试将它绑定到 body 元素,在我的 Durandal 部署中,该元素是在视图模型的入口点 main/shell.js 和 shell.html 之外定义的。我通过在 shell.html 中容器 div 上的 css 绑定中调用我的辅助函数来解决它。 css 绑定检查绑定并运行帮助函数,该函数检查用户登录的帐户类型并应用正确的 CSS 类。
标签: javascript html css knockout.js durandal