2015-06-04 5 views
7

के माध्यम से लूपिंग हैलो मैं टाइपस्क्रिप्ट और JQuery का उपयोग कर सीधे आगे todo ऐप विकसित करने की कोशिश कर रहा हूं। मैं एक enum उस कार्य प्रकार सूचीबद्ध करता है:एक एनम, टाइपस्क्रिप्ट और JQuery

export enum TaskType { FrontEnd, BackEnd, Designer }; 

हालांकि jquery.each या का उपयोग कर emum के माध्यम से पाशन पाश के लिए, मैं पाने के निम्न परिणाम, (तब मूल्यों अनुक्रमित):

 FrontEnd, BackEnd, Designer, 0, 1, 2 

निम्नलिखित कोड I लूप के माध्यम से लूप है:

 constructor(e?: Object) {    

      var template = this.FormTemplate; 

      $(e).append(template); 

      var sel = template.find('select'); 

      /*$.each(TaskType, function (index, el) { 
       sel.append("<option value='" + index + "'>" + el + "</option>"); 
      });*/ 

      for(var i=0; i < (typeof TaskType).length; i++){ 
       sel.append("<option value='" + TaskType[i] + "'>" + TaskType[i] + "</option>"); 
      } 

     } 

क्या कोई मुझे बता सकता है कि यह क्यों है?

उत्तर

18

सादा जेएस में संकलित होने पर टाइपस्क्रिप्ट एनम्स दोनों प्रतीकात्मक नाम और संख्यात्मक मान गुणों के रूप में होते हैं और यह बताते हैं कि जब आप ऑब्जेक्ट के गुणों का आकलन करने का प्रयास करते हैं तो आपको FrontEnd, BackEnd, Designer, 0, 1, 2 क्यों मिलता है। जैसा कि मुझे सबसे अच्छा पता है, केवल प्रतीकात्मक नामों का आकलन करने के लिए कोई संकलन तरीका नहीं है। आप उन सभी को गिन सकते हैं और किसी भी संख्या को छोड़ सकते हैं।

this article से, आप देख सकते हैं कि टाइपस्क्रिप्ट एनम जेएस में कैसे संकलित होता है।

आप इस टाइपप्रति है:

//TypeScript declaration: 
enum StandardEnum {FirstItem, SecondItem, ThirdItem}; 

यह इस Javscript को संकलित करता है:

//Compiled javascript: 
var StandardEnum; 
(function (StandardEnum) { 
    StandardEnum[StandardEnum["FirstItem"] = 0] = "FirstItem"; 
    StandardEnum[StandardEnum["SecondItem"] = 1] = "SecondItem"; 
    StandardEnum[StandardEnum["ThirdItem"] = 2] = "ThirdItem"; 
})(StandardEnum || (StandardEnum = {})); 
; 

अनिवार्य रूप से यह परिणाम है कौन सा:

var StandardEnum = { 
    "FirstItem": 0, 
    "SecondItem": 1, 
    "ThirdItem": 2, 
    "0": "FirstItem", 
    "1": "SecondItem", 
    "2": "ThirdItem" 
}; 

तो, जब तक आप विशेष रूप से ध्यान न दें संख्यात्मक गुण, केवल enum नामों का आकलन करने का कोई तरीका नहीं है।

आप कर सकता है कि इस तरह:

for (var item in StandardEnum) { 
    if (StandardEnum.hasOwnProperty(item) && !/^\d+$/.test(item)) { 
     console.log(item); 
    } 
} 

कार्य डेमो: http://jsfiddle.net/jfriend00/65cfg88u/


FYI करें, यदि आप वास्तव में क्या चाहते हैं:

var StandardEnum = { 
    "FirstItem": 0, 
    "SecondItem": 1, 
    "ThirdItem": 2 
}; 

फिर, हो सकता है आप चाहिए enum का उपयोग न करें और बस इस मानक जेएस घोषणा का उपयोग करें। फिर, आप Object.keys(StandardEnum) के साथ गुण प्राप्त कर सकते हैं।

+0

स्पष्टीकरण के लिए धन्यवाद लेकिन इसे कुंजी के रूप में वापस करने का अर्थ नहीं होगा: मूल्य वस्तु ?, यह एक बड़ा छोड़ दिया गया है, वैसे भी मैं इसका उपयोग कर समाप्त हुआ: यदि (टास्कटाइप [i]! == अपरिभाषित) में लूप क्योंकि यह मूल्यों को फिर से परिभाषित मान देता है। – meji

+1

@meji - आप जो कुछ भी चाहते हैं उसे वापस कर सकते हैं - मैं आपको दिखा रहा था कि आप केवल नामित गुणों की पहचान कैसे कर सकते हैं। एफवाईआई, शायद आपको एक जेएस ऑब्जेक्ट को एनम के बजाए गुणों के साथ परिभाषित करना चाहिए यदि आप यही चाहते हैं। – jfriend00

+0

डाउनवोट क्यों? यह जवाब गलत कैसे है? – jfriend00

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