0

Kendo MVVM フレームワークを使用する Kendo アプリ: アプリのすべての部分に共通の情報である「グローバル」ビューモデルがあります。たとえば、プロパティ isLoggedIn を持つ UserState です。

多くの異なる View と ViewModel が userState オブジェクトにアクセスします (Kendo では、1 つの View が 1 つの ViewModel にバインドされていることがわかります)。

たとえば、認証されていない場合、ホームページに [ログイン] ボタンが表示されることがあります。ログインすると、他のすべての画面の動作が異なるため、各 ViewModel は UserState オブジェクトを参照する必要があります。ただし、それらのいずれかが変更された場合、Kendo Observable オブジェクトを使用したため、他のすべてのビューが更新されます。これはうまくいかないようです。

問題を説明するために、ここに簡単な例を設定します: http://jsfiddle.net/rodneyjoyce/uz7ph/11

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

userState = (function ()
{
    var userStateViewModel = kendo.observable({
                                                  isLoggedIn: false
                                              });    
    function loginUser()
    {
        userStateViewModel.set("isLoggedIn", true);
        alert('Logged in');
    };

    return {            
        userStateViewModel: userStateViewModel,
        loginUser: loginUser
    }
})();

var viewModel1 = kendo.observable({
    label: 'ViewModel1',
    isLoggedInVM1: function() {
        return userState.userStateViewModel.get("isLoggedIn");
    },
    logIn: function ()
    {
        //when calling LoginUser from here, the binding is not updated, even though the value is changed (true)
        userState.loginUser();
        alert('After Login viewModel1.isLoggedInVM1() = ' + viewModel1.isLoggedInVM1() + ' but the binding has not updated');
    }  

});

alert('Value onLoad = ' + viewModel1.isLoggedInVM1());

//If you uncomment this and call LoginUser from here then afterwards the binding changes to true, but not if you call it from within ViewModel1
//userState.loginUser();


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

userStateViewModel の isLoggedIn の値を変更するために userState.loginUser() を呼び出しても、更新されません。ボタンを実行してクリックすると、問題が表示されます。バインディングには更新された値が反映されません (ただし、アラート ボックスには反映されます)。どんな助けでも感謝します、ありがとう。

注:これは、以前の質問の延長であり、少し先に進みました。

4

1 に答える 1

2

問題は、それuserStateが単純なオブジェクトであり、ObservableObject. このため、userStateViewmodelオブザーバブルの変更イベントは変更イベントをトリガーせずviewmodel1、ビューは更新されません。

userStateのプロパティを作成することでこれを修正できるviewModel1ため、オブザーバブルにラップされます (または、戻りオブジェクトをオブザーバブルの IIFE にラップできます)。

var viewModel1 = kendo.observable({
    label: 'ViewModel1',
    userState: userState,
    isLoggedInVM1: function() {
        return userState.userStateViewModel.get("isLoggedIn");
    },
    logIn: function ()
    {
        userState.loginUser();
    }          
});

このデモを見てください。userStateプロパティにコメントを付けてみると、違いがわかります。

于 2014-03-04T03:53:23.653 に答える