淘汰视图模型已更改

时间:2012-07-26 13:39:08

标签: jquery mvvm knockout.js

我正在尝试使用knockout来创建一个监视视图模型以进行更改的场景,并通知任何订阅者发生了更改,这很正常并且通知被触发,然后我更改了视图并且视图模型更改了通知再次触发,就像在处理视图模型时仍然会观察到属性时,是否有任何解决此问题的方法。

            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。

我想要实现的基本行为如下,我在页面上有一个选项卡列表,每个选项卡都有自己的视图模型。当我单击选项卡时,我想检查视图模型中是否有更改。如果有,我想向视图模型发送通知以保存所有更改。

1 个答案:

答案 0 :(得分:2)

您可以使用computed实现此类功能,该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);​ 会自动触及所有属性(这是使用ko.toJS完成的,它会遍历您的viewmodel)。这比你的扩展简单,不应该有任何处置问题。

{{1}}

此解决方案取自RP Niemeyer的小提琴,但我现在找不到原版。无论如何,信任归于他。