如何在多个viewModel中使用kendo observable属性

时间:2014-03-01 07:43:19

标签: mvvm kendo-ui

在使用Kendo MVVM框架的Kendo应用程序中:我有一个“全局”viewModel,它是应用程序所有部分共有的信息 - 例如UserState,其属性为LoggedIn。

许多不同的View和ViewModel访问userState对象(从我所看到的,1 View绑定到Kendo中的1个ViewModel)。

例如,如果未经过身份验证,我的主页可能会显示“登录”按钮。然后,所有其他屏幕在您登录后的行为会有所不同,因此每个ViewModel都需要引用UserState对象。但是,如果它们中的任何一个更改它,那么所有其他视图应该更新,因为我使用了一个Kendo Observable对象。这似乎不起作用。

我在这里设置了一个简单的例子来说明问题: http://jsfiddle.net/rodneyjoyce/uz7ph/4/

var app = new kendo.mobile.Application();   

var userStateviewModel = kendo.observable({
    isLoggedIn: false,
});

var viewModel1 = kendo.observable({
    label: 'From ViewModel1',
    isLoggedInVM1: userStateviewModel.isLoggedIn    
});

userStateviewModel.set('isLoggedIn', true);
//viewModel1.set('isLoggedInVM1', userStateviewModel.isLoggedIn);

alert(viewModel1.isLoggedInVM1);

kendo.bind($("#testForm"), viewModel1);

userStateViewModel被许多不同的视图使用,因此在ViewModel1中,我公开了iSloggedIn属性并在视图中绑定它(以false开头)。

然后代码在userStateViewModel中将其设置为true - 所以我需要将它的所有观察实例更改为true - 但这不起作用。如果我注释掉这行代码 //viewModel1.set('isLoggedInVM1',userStateviewModel.isLoggedIn);

那么它会起作用,但这会破坏一个可观察的点,因为我不知道哪10个ViewModel会更新它以及何时更新,但所有视图都需要更新新值......

1 个答案:

答案 0 :(得分:2)

isLoggedInVM1: userStateviewModel.isLoggedIn初始化中执行viewModel1时,您将分配在该精确时刻(false)具有的值。相反,使用获取值的函数。

var viewModel1 = kendo.observable({
    label: 'From ViewModel1',
    isLoggedInVM1: function() {
        return userStateviewModel.get("isLoggedIn");
    }
});

然后,在尝试检查isLoggedInVM1时:

alert(viewModel1.isLoggedInVM1());

<h3 data-bind="text: isLoggedInVM1()"></h3>

您的JSFiddle在此修改:http://jsfiddle.net/OnaBai/uz7ph/6/