更新映射的ko模型的一部分

时间:2015-04-12 22:24:04

标签: javascript knockout.js knockout-mapping-plugin

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

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();
            }
        }
     }
 }

1 个答案:

答案 0 :(得分:2)

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

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);