在Knockoutjs中的ViewModels之间共享变量状态
Share variable state between ViewModels in Knockoutjs
我创建了一个应用程序,它有一个顶栏(HeaderViewModel)和一个链接,可以打开一个带有登录表单(LoginViewModel)的模态。
分配给模态的LoginViewModel处理登录功能:
var LoginViewModel = function () {
var self = this;
self.email = ko.observable();
self.password = ko.observable();
self.loggedIn = ko.observable(false);
self.login = function () {
// loggedIn true if ajax succeeded
}
...
}
登录(ajax调用)成功后,模态关闭,HeaderViewModel应该知道loggedIn状态,因此knocking-if/else语句可以根据用户角色处理可见性。
#标头(仅附加到HeaderViewModel):
<!-- ko if: loggedIn --> //loggedIn not known in HeaderViewModel
<p>Visible for logged in users</p>
<!-- /ko -->
app.js:
$(function () {
ko.applyBindings(new HeaderViewModel, $("#header")[0]);
ko.applyBindings(new LoginViewModel, $("#login")[0]);
});
我怎样才能做到这一点?
有两种不同的方法。
1.根视图模型
不要给ko.applyBindings
打两次电话。相反,创建一个根视图模型来组合其他两个。
function RootViewModel() {
this.headerViewModel = new HeaderViewModel();
this.loginViewModel = new LoginViewModel();
}
ko.applyBindings(new RootViewModel());
<body>
<div data-bind="with: headerViewModel">
</div>
<div data-bind="with: loginViewModel">
login dialog code here
</div>
etc.
</body>
然后,您可以选择任何您喜欢的javascript方法,以确保login
功能将共享其知识,包括:
- 在登录
div
中调用$root.login
,并在那里放置登录码 new
用参数通知LoginViewModel
:回调以通知$root
和可能的其他子视图模型(如Header
)更改的当前用户凭证
2.Pub sub
使用某种pub-sub机制。选项包括:
- 小型PubSub
- 淘汰邮箱
LoginViewModel
将发布登录结果,任何订阅者都可以做出相应的响应。
相关文章:
- 在索引.html和应用.js [node.js] 之间共享变量
- 在Knockoutjs中的ViewModels之间共享变量状态
- 共享变量和多个控制器AngularJS
- 在两个浏览器选项卡之间共享变量范围
- Javascript创建函数,以便在其他函数之间共享变量
- 为什么原型允许多个实例共享变量
- 关于node.js/javascript在文件之间共享变量
- 在 AngularJS 和非 AngularJS 弹出窗口之间共享变量
- nodejs-settimeout是否在不同的循环中共享变量
- 在Ember.js中的方法之间共享变量上下文
- 使用NodeJS与客户端共享变量
- 在页面之间共享变量
- 共享工作者确实共享变量
- 如何通过React Native中的组件共享登录状态
- 在Javascript中的函数之间共享变量
- 在 JavaScript 命名空间中共享变量
- 价格计算器 Javascript 帮助 - 共享变量的值
- 在单独文件夹/位置中的.js文件之间共享变量
- Javascript 类属性表现为共享变量
- 如何在嵌套指令之间共享变量