2013-05-28 8 views
12

से टाइपस्क्रिप्ट क्लास मानों को प्रारंभ करना मैं नॉकआउटजेएस के साथ कुछ कक्षाएं बनाने के लिए टाइपस्क्रिप्ट का उपयोग कर रहा हूं, जिसमें वेबएपीआई द्वारा लौटाए गए कुछ JSON से डेटा लोड किया जा रहा है।कन्स्ट्रक्टर

समस्या यह है कि मैं JSON मानों को मेरे टाइपस्क्रिप्ट क्लास में कन्स्ट्रक्टर से कॉपी करना चाहता था: लेकिन यदि मैं इसे केवल बेस क्लास में करता हूं, तो विरासत गुणों को परिभाषित नहीं किया गया है और इसलिए प्रारंभ नहीं किया गया है।

उदाहरण

हम एक JSON प्रतिक्रिया से एक सूची आइटम बनाने के लिए करना चाहते हैं:

export class Product { 
    Name = ko.observable(""); 

    constructor(source) { 
    // a utility that copies properties into this instance 
    utils.CopyProperties(source,this); 
    } 

export class Inventory extends Product { 
    Quantity = ko.observable(0); 
    Price = ko.observable(0); 

    constructor(source) { 
    super(source); // call base c'tor 
    // the quantity and price properties are only now defined 
    } 
} 

संपत्तियों के लिए:

{ Name: "Test", Quantity:1, Price: 100 } 

मैं एक आधार वर्ग उत्पाद और एक विरासत वर्ग सूची है सूची केवल सुपर कन्स्ट्रक्टर कॉल के बाद जेएस आउटपुट कोड में बनाई गई है, इसलिए उत्पाद निर्माण के समय मौजूद नहीं है या निष्पादित किया गया है।

एकमात्र समाधान जो मैं देख सकता हूं वह है कि कन्स्ट्रक्टर से शुरुआती मूल्य लेना है, लेकिन मुझे वास्तव में यह दृष्टिकोण पसंद नहीं है, हालांकि मुझे संदेह है कि यह एकमात्र विकल्प है।

var inventoryItem = new Inventory(); 
    inventoryItem.LoadFrom(source); 
+0

आधार उदाहरण में गुणों की प्रतिलिपि बनाने का उद्देश्य क्या है? क्या प्रतिलिपि के बाद मात्रा और मूल्य परिभाषित किया गया है? – BSick7

+0

मुझे यकीन नहीं है कि मैं समझता हूं कि समस्या क्या है। 'उत्पाद' के निर्माता को' स्रोत' से 'नाम' सेट करना चाहिए और 'सूची' के निर्माता को 'स्रोत' और 'मूल्य' को 'स्रोत' – MiMo

+0

से सेट करना चाहिए समस्या यह है कि आपको प्रतिलिपि गुणों को दो बार कॉल करना होगा: जो कुछ समझ नहीं आया। यदि आपने इसे उत्पाद वर्ग में अभी किया है, तो यह केवल नाम सेट करेगा। यदि आपने इसे केवल सूची में किया है, तो आप इसे उत्पाद में नहीं बुला रहे हैं, इसलिए कोई भी उत्पाद बनाने वाला कोई भी प्रारंभ नहीं किया जाएगा – Quango

उत्तर

8

बेस्ट मैं ऊपर आ सकता है के साथ आप एक आधार अक्रमांकन दिनचर्या है कि निर्माता से कहा जाता है करने के लिए अनुमति देने के लिए इस (नॉकआउट दूर करने के लिए संशोधित किया गया है परीक्षण के लिए निर्भरता):

class utils { 
    public static CopyProperties(source:any, target:any):void { 
     for(var prop in source){ 
      if(target[prop] !== undefined){ 
       target[prop] = source[prop]; 
      } 
      else { 
       console.error("Cannot set undefined property: " + prop); 
      } 
     } 
    } 
} 

class Product { 
    Name = "Name"; 

    constructor(source) { 
    this.init(source); 
    } 

    init(source){ 
    utils.CopyProperties(source,this); 
    } 
} 

class Inventory extends Product { 
    Quantity; 
    Price; 

    constructor(source) { 
    super(source); 
    } 

    init(source){ 
     this.Quantity = 0; 
     this.Price = 0; 
     super.init(source); 
    } 
} 

var item = new Inventory({ Name: "Test", Quantity: 1, Price: 100 }); 

यह अजीब है कि चर केवलके लिए कॉल के बाद जे एस में प्रारंभ कर रहे हैं। शायद raising a work item on codeplex लायक है?

Playground

+0

सुझाव के लिए धन्यवाद: इस तरह के प्रारंभकर्ता को एक अच्छा विकल्प है। मुझे नहीं लगता कि यह टाइपस्क्रिप्ट में एक बग है, क्योंकि मैं उम्मीद करता हूं कि यह जिस तरह से काम करेगा। यह जेएस की गतिशील प्रकृति है: सी # आदि – Quango

+0

के विपरीत, काम करने के लिए कोई मेटाडेटा और प्रतिबिंब नहीं है। एक बग के बजाय एक विषमता। – JcFx

3

यह दृष्टिकोण मेरे लिए काम करने लगता है:

/// <reference path="knockout.d.ts" /> 

export class Product { 
    Name: KnockoutObservableString; 

    constructor(source) { 
     this.Name = ko.observable(source.Name); 
    } 
} 

export class Inventory extends Product { 
    Quantity: KnockoutObservableNumber; 
    Price: KnockoutObservableNumber; 

    constructor(source) { 
     super(source); 
     this.Quantity = ko.observable(source.Quantity); 
     this.Price = ko.observable(source.Price); 
    } 
} 

var item = new Inventory({ Name: "Test", Quantity: 1, Price: 100 }); 
+0

धन्यवाद .. यह भी काम करेगा लेकिन एक बार जब आप बहुत सारे चर जोड़ना शुरू कर देते हैं तो यह थकाऊ कोडिंग के लिए बनाता है। मैं जेसीएफएक्स के विचार को पहली बार कोशिश करूंगा – Quango

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