3

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

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

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

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

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

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

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

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

4

1 回答 1

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/

我希望这有帮助!

于 2013-06-19T16:56:10.113 回答