2014-03-01 38 views
0

在使用Kendo MVVM框架的Kendo应用程序中:我有一个“全局”viewModel,它是应用程序所有部分共有的信息 - 例如, UserState,它有一个属性isLoggedIn。如何在多个视图模型中使用kendo observable属性

许多不同的视图和ViewModels访问userState对象(从我所看到的,1视图绑定到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属性和绑定到它在视图(开始关闭为假)。

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

那么它会工作,但是这违背了观察到的点,因为我不知道是哪10周的ViewModels将更新它,什么时候,但所有的观点需要更新新的价值...

回答

2

当您在viewModel1初始化中执行isLoggedInVM1: userStateviewModel.isLoggedIn时,您正在分配它在该时刻的精确时刻的值(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/

+0

很好,谢谢 - 我不知道,你可以参考它是一个功能 - 这一切运作良好 – Rodney

+0

好吧,我发现了一个问题使用这种方法 - 请参阅此JSFiddle:当我调用userState.loginUser()更改userStateViewModel中isLoggedIn的值时,它不会更新。运行并单击该按钮以查看问题 - 绑定不会反映更新的值(但警报框对象)。任何帮助表示感谢,谢谢。 http://jsfiddle.net/rodneyjoyce/uz7ph/11/ – Rodney

+0

注意:我认为我的新问题已经在上面的评论中丢失了,所以我在这里问它:http://stackoverflow.com/questions/22161922/using-a -kendo观察的属性,在-多的ViewModels – Rodney

相关问题