更新部分映射劫模型

Update part of mapped ko model

如何只更新映射模型的一部分?

var model = { foo: { bar: "hello" }, moo: { la: "world" }};
var mapped = ko.mapping.fromJS(model);

映射结果为:

mapped =
{
   __ko_mapping_object__ : object,
   foo: {
      bar : function c()
   },
   moo: {
      la: function c()
   },
   __proto__ : object

}

由于 foomoo 不可观察,如果我这样做:

mapped.foo = { "bar" : "changed" };

mapped.foo = ko.mapping.fromJS({ "bar" : "changed" });

对象已更新但未触发重新绑定。

有什么想法吗?我需要在更新模型的一部分时进行绑定。

我的一个想法是抓取部分模型,然后强制重新绑定。

triggerObjectRebind(mapped.foo);

function triggerObjectRebind(model) {
    for (var property in model) {
        if (model.hasOwnProperty(property)) {
            if (typeof model[property] === "object") {
                triggerObjectRebind(model[property]);
            } else if (typeof model[property] === "function") {
                model[property].valueHasMutated();
            }
        }
     }
 }

更新时,需要将映射对象作为参数传入。相应的属性将被更新。

var model = {
    foo: { bar: "hello" },
    moo: { la: "world" }
};
var mapped = ko.mapping.fromJS(model);

var newFoo = { bar: "changed" };
// do the update on the foo object
ko.mapping.fromJS(newFoo, {}, mapped.foo);