2017-08-01 12 views
5

मैं knockout.js के साथ नया हूं और मुझे नहीं पता कि मेरी ऑब्जेक्ट के साथ एकाधिक मैपिंग कैसे करें। कि सर्वर से अपने डेटा है:knockout.js नेस्टेड ऑब्जेक्ट्स में एकाधिक मैपिंग

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" 
       } 
      ] 
     } 
    ] 
} 

मैं पूरी वस्तु पर एक पहले मानचित्रण कुछ datas करते हैं और ko.computed:

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); 
    } 

इस क्रियान्वित करने के बाद, मैं क्या मैं पहली बार के लिए चाहते भाग:

self.dataModel = ko.mapping.fromJS(persons, person_mapping); 

लेकिन अब, मैं अनुबंध सरणी के साथ एक ही बात करने के लिए अंदर व्यक्तियों वस्तु चाहते हैं, कि एक मानचित्रण लागू करते हैं और कुछ की तरह ko.computed कर कहने के लिए है यह:

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); 
     } 

लेकिन मुझे नहीं पता कि मेरी दूसरी मैपिंग कैसे लागू करें, कुछ भी काम नहीं करता है।

उत्तर

3

आप myPersonModel की पहली पंक्ति में अपना दूसरा मैपिंग लागू कर सकते हैं। आप अपने द्वारा उपयोग किए जा रहे प्रत्येक कन्स्ट्रक्टर में मैपिंग रणनीतियों को घोंसले रख सकते हैं।

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>

+0

धन्यवाद, यह बहुत आसान है मुझे इस बारे में नहीं सोचा था कि था। मैं पहली बार मैपिंग करने की कोशिश कर रहा था, जबकि मुझे इसे पहले में करना था। –

संबंधित मुद्दे