我在这里发布了我的代码:http://jsfiddle.net/HYDU6/6/ 这是我实际使用的一个非常精简的版本,但捕获了我的问题的本质。我的观点模型是这样的:
var viewModel = {
objects: {
foo: [
{ text: "Foo's initial" },
],
bar: [
{ text: "Bar's initial" },
]
}
}
我正在使用ko.mapping插件和我的create
处理程序objects
从Obj
然后objects.foo
实例化objects.bar
,返回结果两个数组中的项目。这部分工作正常;我用
var view = {};
ko.mapping.fromJS(viewModel, mapping, view);
我的问题是根据新数据进行更新。 (即从服务器获取数据)。我有一个新数据的对象,我尝试
ko.mapping.fromJS(new_model, mapping, view);
我怀疑这是不正确的,但尽管进行了广泛的搜索,我还是无法使其正常工作。 (相信我,已经好几天了。):无论如何,谢谢你的帮助。
编辑:所以我大部分时间都认为它 - 我过于依赖于mapping.fromJS而且某些东西没有被包装成可观察的东西。我也意识到我不需要create(),只需要update(),因为它在create()之后调用。如果你有类似的问题,请告诉我!答案 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/
我希望这有帮助!