来自JS的淘汰赛映射与额外的proeprties

时间:2017-11-07 10:14:57

标签: javascript json knockout.js knockout-mapping-plugin

我有这个jSON结构。

{
"customer": {
    "idcustomer": 2,
    "name": "test_2",
    "vat": "test_vat_2",
    "obs": "obs_2",
    "deleted": 0
},
"addresses": [
    {
        "idaddress": 9,
        "street": "street_2_9",
        "number": "number_2_9",
        "country": "country_2_9",
        "default": true,
        "label": "labe_2_9",
        "deleted": 0
    },
    {
        "idaddress": 10,
        "street": "1",
        "number": "number_2_9",
        "country": "country_2_10",
        "default": false,
        "label": "label_2_10",
        "deleted": 0
    }
],
"contacts": []

}

使用knockout映射插件,我能够生成一个挖空可观察对象。但是,当尝试使用映射参数向对象添加额外属性时,我发现了一些问题。目标是将“SelectedAddress”添加到主对象,并在每个地址中添加“defaultLabel”observabale。

目前我有这种映射结构将属性添加到地址children:

var mapping = {

'addresses': {
    create: function (options) {
        return (new (function () {
            this.defaultLabel= ko.computed(function () {
                return (this.default() == 0) ? "" : this.label();
                }, this);
            ko.mapping.fromJS(options.data, {}, this);
        })());
    }
},

}

这是为了将“SelectedAddress”添加到主JSON:

create: function (options) {
        return new function () {

            var model = ko.mapping.fromJS(options.data, {}, this);
            // Direccion
            model.direccionSeleccionada = ko.observable();
            model.getDireccion = ko.computed({
                read: function() {
                    if (model.direccionSeleccionada() != null) {
                        return model.direccionSeleccionada();
                    } else {
                        return [{
                                idaddress: -1,
                                street : '',
                                number: '',
                                country: '',
                                default: '',
                                label: '',
                                deleted: '',
                        }];
                    }
                },
                write: function(value) {
                    self.direccionSeleccionada(value);
                },
                owner: self
            });
        }
    }

我无法找到让他们俩的方法

想法?

谢谢

1 个答案:

答案 0 :(得分:0)

我明白了。只为某人;就像生成“地址”的映射一样简单,为它添加另一个映射。

var mapping = {
create: function (options) {
    return new function () {
        var model = ko.mapping.fromJS(options.data, {
            'adresses': {
                create: function (options) {
                    return (new(function () {
                        this.labelDefault= ko.computed(function () {
                            return (this.default() == 0) ? "" : this.label();
                        }, this);
                        ko.mapping.fromJS(options.data, {}, this);
                    })( /* call the ctor here */ ));
                }
            },
        }, this);

        model.direccionSeleccionada = ko.observable();
        model.getDireccion = ko.computed({
            read: function () {
                if (model.selectedAddress() != null) {
                    return model.selectedAddress();
                } else {
                    return [{
                        idaddress: -1,
                        street: '',
                        number: '',
                        country: '',
                        default: '',
                        label: '',
                        deleted: ''
                    }];
                }
            },
            write: function (value) {
                self.selectedAddress(value);
            },
            owner: self
        });
    }
}

}

谢谢!