我在这里发布了我的代码:http://jsfiddle.net/HYDU6/6/ 这是我实际使用的精简版本,但捕获了我问题的本质。我的 View 模型是这样的:
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() 之后调用的。如果您有类似的问题,请告诉我!
最佳答案
约翰,
使用 ko.mapping 更新数据时,请确保不要创建新项目。您的 UI 已经绑定(bind)到现有项目,因此您只想更新现有项目属性的值;不创建新的。对于您发布的示例,您需要调整 map 的“更新”方法以将新值插入正确的 ko.observable 属性,而不是在其位置创建新对象。 ko.mapping 的“update”方法根据用途有几个不同的参数列表,第三个参数是 map 的目标对象。您可能想要更新该对象的属性。
obj.target[label].items[0].text(obj.data[label][0].text);
但是,这有点困惑。您可能希望创建第二级映射(创建/更新)来处理 fiddle 中的“深层”对象层次结构。例如,一个映射用于“foo/bar”级别的对象,另一个从“更新”中调用 ko.fromJS,另一个映射用于子 Obj() 对象。
修复后,您会遇到几个简单的绑定(bind)错误,您可以使用另一个“with”绑定(bind)或子数组的“foreach”绑定(bind)来修复这些错误。
总的来说,您只是遇到了几个常见的陷阱,但还不算太严重。您可以在我的博客上了解更多关于其中一些陷阱的信息:http://ryanrahlf.com/getting-started-with-knockout-js-3-things-to-know-on-day-one/
希望对您有所帮助!
关于javascript - Knockout映射插件[create,update]: objects created,无法更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17195814/