Knockout映射插件[create,update]:创建的对象,无法更新

时间:2013-06-19 15:55:08

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

我在这里发布了我的代码:http://jsfiddle.net/HYDU6/6/ 这是我实际使用的一个非常精简的版本,但捕获了我的问题的本质。我的观点模型是这样的:

var viewModel = {
    objects: {
        foo: [
            { text: "Foo's initial" },
        ],
        bar: [
            { text: "Bar's initial" },
        ]
    }
}

我正在使用ko.mapping插件和我的create处理程序objectsObj然后objects.foo实例化objects.bar,返回结果两个数组中的项目。这部分工作正常;我用

var view = {};
ko.mapping.fromJS(viewModel, mapping, view);

我的问题是根据新数据进行更新。 (即从服务器获取数据)。我有一个新数据的对象,我尝试

ko.mapping.fromJS(new_model, mapping, view);

我怀疑这是不正确的,但尽管进行了广泛的搜索,我还是无法使其正常工作。 (相信我,已经好几天了。):无论如何,谢谢你的帮助。

编辑:所以我大部分时间都认为它 - 我过于依赖于mapping.fromJS而且某些东西没有被包装成可观察的东西。我也意识到我不需要create(),只需要update(),因为它在create()之后调用。如果你有类似的问题,请告诉我!

1 个答案:

答案 0 :(得分:4)

约翰,

使用ko.mapping更新数据时,请确保不要创建新项目。您的UI已绑定到现有项目,因此您只想更新现有项目属性的值;不创造新的。对于您发布的示例,您需要调整地图的“更新”方法,以将新值插入到正确的ko.observable属性中,而不是在其中创建新对象。 ko.mapping“update”方法根据用途有一些不同的参数列表,第三个参数是地图的目标对象。您可能希望更新该对象的属性。

obj.target[label].items[0].text(obj.data[label][0].text);

但是,这有点乱。您可能希望创建第二级映射(创建/更新)来处理“深层”对象层次结构,就像您的小提琴一样。例如,“foo / bar”级别的对象的一个​​映射,以及“update”中的另一个ko.fromJS调用,以及子Obj()对象的另一个映射。

修复之后,您将遇到一些简单的绑定错误,您可以使用另一个“with”绑定或子数组的“foreach”绑定来修复这些错误。

总的来说,你只是遇到了几个常见的陷阱,但没有太严重。您可以在我的博客上了解一些关于这些陷阱的更多信息:http://ryanrahlf.com/getting-started-with-knockout-js-3-things-to-know-on-day-one/

我希望这有帮助!