修改一个不同的儿童viewmodel的儿童视图模型

时间:2016-11-20 07:05:45

标签: javascript asp.net-mvc knockout.js

我的屏幕主视图模型。它由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中的值?

1 个答案:

答案 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; }

请注意,每个子视图模型也具有写入权限,因此您必须小心不要意外更新可观察的