Knockout.js映射不绑定子模型

Mat*_*ker 6 knockout-mapping-plugin knockout.js

我遇到了knockout.js的问题,并且映射插件没有为源数据中的子数组创建模型

var data = {
    outer: [
        {
        'id': 1,
        name: 'test outer',
        inner: [{
            'id': 1,
            name: 'test inner'}]}]
};

function OuterModel(data) {
    var self = this;
    ko.mapping.fromJS(data, {}, this);

    self.fullText = ko.computed(function() {
        return self.id() + ". " + self.name();
    });
}

function InnerModel(data, parent) {
    var self = this;
    ko.mapping.fromJS(data, {}, this);

    self.fullText = ko.computed(function() {
        return self.id() + ". " + self.name() + "(" + parent + ")";
    });
}

function PageModel() {
    var self = this;
    this.data = null;
}

var mapping = {
    'outer': {
        key: function(data) {
            return ko.utils.unwrapObservable(data.id);
        },
        create: function(options) {
            var thisModel = new OuterModel(options.data);
            return thisModel;
        }
    },
    'inner': {
        key: function(data) {
            return ko.utils.unwrapObservable(data.id);
        },
        create: function(options) {
            var thisModel = new InnerModel(options.data);
            return thisModel;
        }
    }
};

var model = new PageModel();
model.data = ko.mapping.fromJS(data, mapping);
Run Code Online (Sandbox Code Playgroud)

(这是我可以为此做的一个小型回购.这里提供小提琴:http://jsfiddle.net/msieker/6Wx3s/)

简而言之,永远不会调用InnerModel构造函数.我已尝试使用'InnerModel'此片段中的两者以及'inner'映射中的内容.从我所看到的大多数情况来看,这应该可行,但显然我错过了一些东西.

任何人都有这方面的经验可以指出我正确的方向?

编辑: 根据@John Earles的回答,我已经把它更接近我需要的东西了:

var data = {
    outer: [
        {
        'id': 1,
        name: 'test outer',
        inner: [{
            'id': 1,
            name: 'test inner'}]}]
};

var outerMapping = {
    'outer': {
        key: function(data) {
            return ko.utils.unwrapObservable(data.id);
        },
        create: function(options) {
            var thisModel = new OuterModel(options.data);
            return thisModel;
        }
    }
};

function OuterModel(data) {
    var self = this;
    ko.mapping.fromJS(data, innerMapping, this);

    self.fullText = ko.computed(function() {
        return self.id() + ". " + self.name();
    });
}

var innerMapping = {
    'inner': {
        key: function(data) {
            return ko.utils.unwrapObservable(data.id);
        },
        create: function(options) {
            console.log(options);
            var thisModel = new InnerModel(options.data, options.parent());
            return thisModel;
        }
    }
};

function InnerModel(data, parent) {
    var self = this;
    ko.mapping.fromJS(data, {}, this);

    self.fullText = ko.computed(function() {
        return self.id() + ". " + self.name() + "(" + parent + ")";
    });
}

function PageModel() {
    var self = this;
    this.data = null;
}

var model = new PageModel();
model.data = ko.mapping.fromJS(data, outerMapping);
ko.applyBindings(model);?
Run Code Online (Sandbox Code Playgroud)

然而,parent传递给InnerModel的是null,这就是我追求映射插件的全部原因.文档让我相信这应该是将options参数传递给create函数,但我得到的是observable其值null.还有这方面的其他指示?

Joh*_*les 2

您没有将映射选项(定义如何映射内部)传递到 OuterModel 映射调用中。

function OuterModel(data) {
    var self = this;
    ko.mapping.fromJS(data, mapping, this);

    self.fullText = ko.computed(function() {
        return self.id() + ". " + self.name();
    });
}
Run Code Online (Sandbox Code Playgroud)

编辑:更新了小提琴以显示父级的手动附件:

http://jsfiddle.net/jearles/6Wx3s/5/