javascript - Knockout映射插件[create,update]: objects created,无法更新

标签 javascript knockout.js knockout-mapping-plugin

我在这里发布了我的代码: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/

相关文章:

javascript - 我应该为 JavaScript 链接使用哪个 "href"值, "#"还是 "javascript:void(0)"?

javascript - React JS onClick 方法没有被调用

javascript - Knockoutjs 跟踪 ajax 调用后的变化

javascript - Knockout 映射初始化的最佳代码

javascript - jQuery 复选框选择和更改类

jquery - KoGrid:访问网格

jquery - koGrid 清空我们的网格,而不是使用 Asp.Net MVC 3 使用 KnockoutJS 进行更新

javascript - knockout : Select Binding Returns Array of Values

javascript - 使用 Knockout.js 和映射的 ASP.NET

javascript - 一对一过滤JavaScript数组添加/删除条件