2016-01-25 15 views
6

Sto ricevendo il seguente JSON dal server:Uncaught TypeError: Impossibile convertire un valore Simbolo per una stringa

enter image description here

E poi sto cercando di mappare utilizzando $ .map in AJAX la chiamata di success, come segue:

$.ajax({ 
     type: "GET", 
     url: urlGetStaticData, 
     success: function (data) { 
      self.AvailableTags(data[0].Value); 
      self.MeasurementUnits($.map(data[1].Value, function (item) { return ko.mapping.fromJS(item) })); 

e l'ultima riga genera la seguente eccezione:

Uncaught TypeError: Cannot convert a Symbol value to a string

quando tenta di mappare la proprietà con il nome Symbol.

Da quello che ho letto, javascript ha recentemente (o almeno pianificato) l'aggiunta di un "nuovo tipo primitivo di simbolo". Questo problema potrebbe essere correlato? Che soluzione alternativa c'è? Qualsiasi aiuto molto apprezzato.

+1

@MikeC Penso che la vera domanda qui sia, in che modo un'istanza di Symbol è coinvolta qui in primo luogo? Non può provenire da un risultato 'JSON.parse()'. – Pointy

+2

Se 'data' è deserializzato JSON, non avrà alcuna proprietà' Symbol'-named o 'Symbol', quindi non posso vedere come si potrebbe essere in esecuzione in questo. Puoi creare un [MCVE] (/ help/mcve)? –

risposta

8

Il problema è che KO sta tentando di utilizzare una funzione denominata Symbol (poiché le funzioni osservabili KO sono funzioni) perché una delle proprietà nei dati è denominata Symbol. Ma su un motore ES2015, ci sarà una funzione globale Symbol come parte dell'ambiente JavaScript. Quindi KO chiama quella funzione, invece, ottiene un Symbol indietro invece di quello che si aspetta, e quindi (apparentemente) fa qualche operazione che tenta di forzare quel valore a una stringa. Quale fallisce. (Io non sono sicuro perché finisce per chiamare il globale Symbol piuttosto che qualcosa di shadowing, ma KO usa un po 'di codice dinamico piuttosto complesso e with dichiarazioni, quindi ...)

questo sarebbe un bug nel KO mapper causato dalle recenti modifiche del linguaggio JavaScript. Come correzione a breve termine, rinomina la proprietà prima di mapparla.

+0

Ah, questo ha senso. Un po 'di bug insidioso lì. –

+0

@ Mike: grande ora. :-) –