I'm new with knockout.js and I don't know how to do multiple mapping with my object. That's my data from the server :
var persons = {
    'value': [
        {
            "id": "1",
            "civility": "Mr.",
            "firstname": "john",
            "lastname": "doe",
            "phone": "00 00 00 00 00",
            "email": "[email protected]",
            "contract": [
                {
                    "id": "1",
                    "gamme": "Gamme 1",
                    "formula": "Formula 1"
                },
                {
                    "id": "2",
                    "gamme": "Gamme 2",
                    "formula": "Formula 2"
                }
            ]
        }
    ]
}
I do a first mapping on the whole object and ko.computed some datas :
var person_mapping = {
        'value': {
            create: function (options) {
                if (options.data != null) {
                    return new myPersonModel(options.data);
                }
            }
        }
    }
var myPersonModel = function (data) {
        ko.mapping.fromJS(data, {}, this);
        this.fullName = ko.computed(function () {
            return this.civility() + ' ' + this.lastname() + ' ' + this.firstname();
        }, this);
    }
After executing this, I get what I want for the first part :
self.dataModel = ko.mapping.fromJS(persons, person_mapping);
But now, I want to do the same thing with the contract array inside the persons object, that is to say apply a mapping and do some ko.computed like this :
var contract_mapping = {
            'contract': {
                create: function (options) {
                    if (options.data != null) {
                        return new myContractModel(options.data);
                    }
                }
            }
        }
var myContractModel = function (data) {
            ko.mapping.fromJS(data, {}, this);
            this.contractName = ko.computed(function () {
                return this.gamme() + ' ' + this.formula();
            }, this);
        }
But I don't know how to apply my second mapping, nothing seems to work.
You can apply your second mapping in the first line of myPersonModel. You can keep nesting the mapping strategies in every constructor you're using.
var myPersonModel = function(data) {
  ko.mapping.fromJS(data, contract_mapping, this);
  /* ... */
};
var persons = {
  'value': [{
    "id": "1",
    "civility": "Mr.",
    "firstname": "john",
    "lastname": "doe",
    "phone": "00 00 00 00 00",
    "email": "[email protected]",
    "contract": [{
        "id": "1",
        "gamme": "Gamme 1",
        "formula": "Formula 1"
      },
      {
        "id": "2",
        "gamme": "Gamme 2",
        "formula": "Formula 2"
      }
    ]
  }]
}
var contract_mapping = {
  "contract": {
    create: function(options) {
      return new myContractModel(options.data);
    }
  }
}
var person_mapping = {
  'value': {
    create: function(options) {
      if (options.data != null) {
        return new myPersonModel(options.data);
      }
    }
  }
}
var myContractModel = function(data) {
  ko.mapping.fromJS(data, {}, this);
  this.type = "myContractModel";
};
var myPersonModel = function(data) {
  ko.mapping.fromJS(data, contract_mapping, this);
  this.fullName = ko.computed(function() {
    return this.civility() + ' ' + this.lastname() + ' ' + this.firstname();
  }, this);
}
console.log(
  ko.mapping.fromJS(persons, person_mapping)
    .value()[0]
    .contract().map(x => x.type)
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-debug.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.min.js"></script>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With