在保持绑定的同时替换Knockout Model中的整个对象

时间:2013-12-20 17:11:49

标签: knockout.js

我似乎无法在KOs网站或Google搜索上找到任何文档来描述如何在维护绑定的同时更改视图模型中的整个对象。

$(function () {
    var stuff = {
        IntroData: {
            SomeObject: {
                Name: 'Hello'
            }
        }
    };

    var someObject = {
        Name: 'World'
    }
    window.viewModel = ko.mapping.fromJS(stuff);
    ko.applyBindings(window.viewModel);

    $("#btnUpdateSomeObject").click(function() {
        try
        {
            window.viewModel.IntroData.SomeObject = ko.mapping.fromJS(someObject);
        } catch(ex) {
            alert("Failure: " + ex.toString());
        }
    });
});

我有一个非工作小提琴,描述了这种情况:http://jsfiddle.net/W5X2b/

这可能吗?我觉得这对KO来说是一个巨大的缺点,或者我在某种程度上不恰当地使用它。

2 个答案:

答案 0 :(得分:6)

使用ko.mapping.fromJS时的问题。
因此,您应使用ko.mapping.fromJS(someObject)而不是ko.mapping.fromJS(someObject, {}, window.viewModel.IntroData.SomeObject);

  1. someObject您的最新数据。
  2. {}映射选项。
  3. window.viewModel.IntroData.SomeObject您想要更新的目标对象。
  4. Working Demo

    更新
    来自KnockoutJS Mapping Documentation

      

    ko.mapping.fromJS的第三个参数表示目标

答案 1 :(得分:0)

是的,这是可能的,但SomeObject需要是一个可观察的。

var stuff = {
    IntroData: {
        SomeObject: ko.observable({
            Name: 'Hello'
        })
    }
};

当SomeObject是一个可观察的,当你'设置'它时; ko将更新视图。

window.viewModel.IntroData.SomeObject(ko.mapping.fromJS(someObject));

See fiddle