knockout.js在第二次尝试时没有通过映射插件更新observable

时间:2014-02-28 16:42:26

标签: knockout.js

ko.mapping.fromJS(settings, self.settings);似乎没有第二次更新我的动态视图。我相信它是因为值是相同的,所以订阅永远不会被激发再次更新视图。视图包含默认值并以模态打开,因此您第二次看到默认值。我执行app.viewModel.members.eventSchedule.editSettings.settings.GameTime("204"),如果该值与第一次调用中的原始值不同,则会更新。重新映射后,我可以对该self.settings对象上的所有可观察对象执行订阅吗?我知道我可以做valueHasMutated或者指定一个空值然后是真值,但我不想为10个属性做这个。

这有效

self.dialog.isOpen(true);
ko.mapping.fromJS(settings, self.settings);
self.settings.GameTime.valueHasMutated();

的Javascript

function EditSettings() {
        var self = this;

        self.settings = null;

        self.dialog = new Dialog();
        self.open = function (open, url) {

            if (open) {
                var options = {
                    url: url,
                    type: 'GET',
                    success: function (settings) {
                        self.dialog.isOpen(true);
                        ko.mapping.fromJS(settings, self.settings);
                    }
                };

                app.call(options);
            } else {
                self.dialog.isOpen(false);
            }
        };
   }

2 个答案:

答案 0 :(得分:0)

我知道派对迟到了,但我在knockout.mapping上遇到了同样的问题,并使用了接受的(但由于某种原因,downvoted)解决方案。但是我发现在我的特定情况下,映射插件将 ko_mapping 对象添加到不是可观察的属性(因此没有.valueHasMutated来调用)。这可能是一个奇怪的情况(我正在努力清理一些可观察的调用)但它确实在代码中显示了一个可以避免的潜在异常:

这是我为避免导致异常的非可观察性而做的(使用上面的变量保持一致):

ko.mapping.fromJS(settings, self.settings);
        //Indicate mutated value for all properties
        for (var property in self.settings) {
            if (typeof (self.settings[property].valueHasMutated) === "function") {
                self.settings[property].valueHasMutated();
            }                
        }

在映射的observable中存在非可观察属性的情况下,这应该是有用的。

答案 1 :(得分:-1)

这就像一个魅力。

self.dialog.isOpen(true);
ko.mapping.fromJS(settings, self.settings);

for (var property in self.settings) {
   self.settings[property].valueHasMutated();
}