挖空映射插件[创建,更新]:对象已创建,无法更新

Knockout mapping plugin [create, update]: objects created, cannot update

本文关键字:更新 创建 对象 映射 插件      更新时间:2023-09-26

我在这里发布了我的代码:http://jsfiddle.net/HYDU6/6/这是我实际使用的精简版本,但抓住了我问题的本质。我的视图模型是这样的:

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

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

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

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

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

我怀疑这是不正确的,但尽管进行了广泛的搜索,我还是无法让它工作。(相信我,已经好几天了。

编辑:所以我基本上已经弄清楚了 - 我过于依赖mapping.fromJS,并且某些东西没有被包装到可观察量中。我也意识到我不需要 create((,只需要 update((,因为它无论如何都是在 create(( 之后调用的。如果您有类似的问题,请告诉我!

John,

使用 ko.mapping 更新数据时,请确保不要创建新项目。 您的 UI 已绑定到现有项,因此您只想更新现有项属性的值;不创建新的。 对于您发布的示例,您需要调整地图的"update"方法,以将新值插入到正确的 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/

我希望这有帮助!