2015-07-08 14 views
5

utilizzando [email protected] e [email protected].babel sta esportando "questo" come non definito nella proprietà calcolata su ember

Fonte emberjs modello

export default DS.Model.extend({ 
    name: DS.attr('string'), 

    displayName : Ember.computed('name',() => { 
     return this.get('name'); 
    }) 
}); 

Tradotto modello

'use strict'; 

var _this = undefined; 

exports['default'] = DS['default'].Model.extend({ 
    name: DS['default'].attr('string'), 

    displayName: Ember.computed('name', function() { 
     return _this.get('name'); //at this point _this is undefined 
    }) 
}); 

Il guaio è che non è mai _this impostare il modello. Perché è così?

risposta

5

Babel lo sta esportando come non definito perché il contesto che si sta conservando utilizzando la funzione freccia ad angolo non è definito.

Non v'è alcuna differenza tra quello che hai in questo momento e la seguente:

let options = { 
    name: DS.attr('string'), 

    displayName : Ember.computed('name',() => { 
     return this.get('name'); 
    }) 
}; 
console.log(this); // undefined 
export default DS.Model.extend(options); 

Il contesto, in questo caso non è definito. Stai passando le opzioni a DS.Model l'oggetto non esiste ancora.

export default DS.Model.extend({ 
    name: DS.attr('string'), 

    displayName : Ember.computed('name', function() { 
     return this.get('name'); 
    }) 
}); 

Su una nota indipendenti, dal momento che si sta utilizzando brace facciamo fanno uso di ES6 destrutturazione per rendere il codice look 'più bello':

import Ember from 'ember'; 
import DS from 'ember-data'; 

const { computed } = Ember; 
const { attr, Model } = DS; 

export default Model.extend({ 
    name: attr('string'), 

    displayName : computed('name', function() { 
     return this.get('name'); 
    }) 
}); 
+0

così mi cuciture che si può usare solo la nuova costruzione di una freccia quando si trova all'interno di una funzione. Avrei pensato che "questo" si riferisce all'oggetto genitore in entrambi i casi. – jax

+1

'() => {}' === 'function() {} .bind (this)' nel tuo caso 'this' ===' indefinito', non esiste ancora un oggetto padre, stai passando un oggetto di opzioni per 'DS.Model' l'istanza' DS.Model' non è stata ancora creata. –

+1

Si usa sempre la freccia grossa quando si desidera preservare il contesto o quando il contesto non ha importanza (ragioni estetiche) –