1

ビューモデルの変更を監視し、変更が発生したことをサブスクライバーに通知するノックアウトを使用してシナリオを作成しようとしています。これは正常に機能し、通知はオフになりますが、ビューを変更するとビューモデルが変更され、通知が再度発生します、ビューモデルが破棄されているときにプロパティがまだ監視されているようなものですが、この動作を回避する方法はありますか?

            var options = {
            callback: function () {
                var type = "modelChanged";
                var subscription = $.config.core._subscriptions[type];
                if (subscription) {
                    $.config.core._subscriptions[type] = null;
                }
                self.savePersonalInformation();
            },
            event: "forceSave",
            moduleId: "MemberInformationPersonalInfo"
        };
        $.config.core.subscribeView(options);

注: サブスクライブ ビューは、基本的にサブスクライブのラッパーであるカスタム エクステンダーです。

    monitorPropertyValues: function (model) {
        //subscribe to each property in the model to monitor changes to the value
        // loop through all the properties in the model
        for (var property in model) {
            if (model.hasOwnProperty(property)) {
                if (model[property].subscribe) { //subcribe to observable properties
                    // subscribe to changes
                    model[property].subscribe(function(value) {
                        if (value) {
                            $.config.core.notifySubscribers(true, "modelChanged");
                        }
                    });
                }
            }

        }
    }

MonitorPropertyValues は、ビューが初期化されるときに呼び出されます。

私が達成しようとしている基本的な動作は次のとおりです。ページにタブのリストがあり、各タブには独自のビューモデルがあります。タブをクリックすると、ビューモデル内で変更があったかどうかを確認したい。ある場合は、ビュー モデルに通知を送信してすべての変更を保存します。

4

1 に答える 1

2

この種の機能は、computedすべてのプロパティに自動的にアクセスする を使用して実現できます (これは、ビューモデルをウォークする ko.toJS を使用して行われます)。これは拡張機能よりも単純であり、破棄の問題はありません。

var viewModel = {
    data: {
        first: ko.observable("Ted"),
        last: ko.observable("Smith") 
    },
    isChanged: ko.observable(false)
}

viewModel.allChanges = ko.computed(function() {
   ko.toJS(viewModel.data);  //just touches all observables, that's it.
});

viewModel.allChanges.subscribe(function() {
    if (!viewModel.isChanged()) {
        viewModel.isChanged(true);     
    }
});

ko.applyBindings(viewModel);​

この解決策は RP Niemeyer によってフィドルから取得されましたが、現在は元のものが見つかりません。とにかく、信用は彼に行きます。

于 2012-07-26T23:09:15.893 に答える