2014-03-01 74 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

相關問題