Knockout.js 使用ko.mapping将ObservalArray填充到现有方法中

Knockout.js 使用ko.mapping将ObservalArray填充到现有方法中,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,我有一个viewModel,它有一个可观察的耳环 (function () { function myItems() { var self = this; self.itemArray = ko.observableArray(); somefunction() {... } var myViewModel = new myItems(); 此observableArray将包含以下实例: (function () { funct

我有一个viewModel,它有一个可观察的耳环

(function () {
    function myItems() {
        var self = this;
        self.itemArray = ko.observableArray();
        somefunction() {...
}
var myViewModel = new myItems();
此observableArray将包含以下实例:

(function () {
    function item() {
        var self = this;
        self.name = ko.observable("some data");
        self.doStuff = function () {
            return "doing whatever";
        };
    }
    window.item = item
}());
我将json映射到viewModel中

var json = '{"name":"my main property", "itemArray": [ { "name": "Bob" }, { "name" : "Fred" } ] }';

var myViewModel = new myItems();
ko.mapping.fromJSON(state, {}, myViewModel);
如何告诉映射必须使用item对象映射itemArray?如何创建item()和myItems()之间的链接

这里有一把小提琴显示了这个问题

一旦将其序列化为JSON以存储状态,就回到了处理JSON数据以填充视图模型之前的位置

事实上,这是您遇到的第一个问题,您正在序列化新的viewmodel,如果您在viewmodel上序列化itemArray,那么您将拥有您开始使用的数据:

var unmapped = ko.mapping.toJSON(myViewModel1.itemArray);
然后,您可以将其传递到addItems方法:

myViewModel2.addItems(unmapped);
而不是映射它们


这里有一个更新的

解决方案是使用映射选项的create回调

var mapping = {
    'itemArray': {
        create: function (options) {
            //add items to the items object here
            ...

谢谢,但我的小提琴没有反映我的真实代码,它在主视图模型中也有许多属性。我需要使用映射来再次填充这些属性。如果我能解决这个问题,我可能会删除addItems()并使用映射来初始填充我的viewmodel数据。我已经编辑了这个问题并进行了修改,以便更好地解释这个问题。在这种情况下,您需要使用create函数映射,正如Dex所回答的那样。