我的屏幕主视图模型。它由2个子视图模型组成。
一个处理注册部分。 一个处理登录部分。 一个处理菜单部分(如果经过身份验证,可以显示哪些菜单项,以及"欢迎"用户名"类型的东西)。
$(document).ready(function () {
// Create the main View Model
var vm = {
loginVm: new LoginViewModel(),
registerVm: new RegisterViewModel(),
layoutVm: new LayoutViewModel()
}
// Get the Reference data
var uri = '/api/Reference/GetTimezones';
$.getJSON({ url: uri, contentType: "application/json" })
.done(function (data) {
vm.registerVm.Timezones(data);
});
// Bind.
ko.applyBindings(vm);
});
我的登录模式"登录"方法完成后,我想设置" IsAthenticated"菜单模型中的值,以及其他一些用户信息。
所以在我的登录模型中,我有一个SignIn方法。
$.post({ url: uri, contentType: "application/json" }, logindata)
.done(function (data) {
toastr[data.StatusText](data.DisplayMessage, data.Heading);
if (data.StatusText == 'success') {
alert($parent.layoutVm.IsAuthenticated());
}
else {
}
})
.fail(function () {
toastr['error']("An unexpected error has occured and has been logged. Sorry about tbis! We'll resolve it as soon as possible.", "Error");
});
警报代码是我的测试。我希望访问(并设置)layoutVm模型的IsAuthenticated属性。这是我的主View模型中的一个子模型。
然而," $ parent"没有定义。
如何从loginVm更新layoutVm中的值?
答案 0 :(得分:1)
compile
是 binding context 的一部分,只有在评估data-bind 时才能使用(即绑定处理程序) )。
在您的viewmodel结构中,您必须想出一种自己在模型之间进行通信的方法。例如,通过传递父视图模型,或传递共享的observable。您正在描述的问题可以通过使用$parent
来解决,就像我在上一个问题中回答的那样。
如果你想采用其他方法,这里是一个关于如何在视图模型之间共享一个可观察对象的例子。
data-bind="visible: $root.userVM.IsAuthenticated"
var ChildViewModel = function(sharedObs) {
this.myObs = sharedObs;
this.setObs = function() {
this.myObs(!this.myObs());
}.bind(this);
}
var RootViewModel = function() {
this.myObs = ko.observable(false);
this.vm1 = new ChildViewModel(this.myObs);
this.vm2 = new ChildViewModel(this.myObs);
this.vm3 = new ChildViewModel(this.myObs);
}
ko.applyBindings(new RootViewModel());
div { width: 25%; display: inline-block; }
请注意,每个子视图模型也具有写入权限,因此您必须小心不要意外更新可观察的