2015-06-04 18 views
7

Ciao im cercando t sviluppare un dritto todo app avanti con dattiloscritto e JQuery. Ho un enum che elenca i tipi di attività:Looping attraverso un enum, dattiloscritto e JQuery

export enum TaskType { FrontEnd, BackEnd, Designer }; 

Tuttavia scorrendo l'emum utilizzando jquery.each o per ciclo, ottengo il seguente risultato, (valori allora indici):

 FrontEnd, BackEnd, Designer, 0, 1, 2 

Il seguente è il codice che loop attraverso l'enum:

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

     } 

Qualcuno può dirmi perché questo è?

risposta

18

enumerazioni tipografico quando compilati in JS semplici contengono sia il nome simbolico ed i valori numerici come proprietà e che spiega il motivo per cui si ottiene FrontEnd, BackEnd, Designer, 0, 1, 2 quando si tenta di enumerare le proprietà dell'oggetto. Come meglio lo so, non c'è modo di post-compilazione per enumerare solo i nomi simbolici. Puoi enumerarli tutti e saltare qualsiasi cosa sia un numero.

Da this article, si può vedere esattamente come un enum dattiloscritto compila in JS.

Se avete questo dattiloscritto:

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

Compila questa javscript:

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

che è essenzialmente questo risultato:

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

Quindi, a meno che specificamente ignora il proprietà numeriche, non c'è modo di enumerare solo i nomi enum.

Si potrebbe fare che in questo modo:

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

demo di lavoro: http://jsfiddle.net/jfriend00/65cfg88u/


Cordiali saluti, se ciò che si vuole veramente è:

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

Quindi, forse è meglio non usare l'enum e basta usare questa dichiarazione JS standard. Quindi, si potrebbe ottenere le proprietà con Object.keys(StandardEnum).

+0

Grazie per la spiegazione, ma non avrebbe senso restituirlo come chiave: valore oggetto ?, questa è una grande delusione, comunque ho finito per usare: if (TaskType [i]! == undefined) in per loop poiché restituisce valori quindi valori non definiti. – meji

+1

@meji - si può tornare quello che vuoi - Stavo solo che vi mostra come è possibile identificare solo le proprietà denominate. Per tua informazione, forse dovresti semplicemente definire un oggetto JS con proprietà piuttosto che enum se è quello che vuoi che sia. – jfriend00

+0

Perché il downvote? In che modo questa risposta è sbagliata? – jfriend00

Problemi correlati