2014-11-26 10 views
23

Vorrei riaprire le classi di framework di dati Ember o Ember. Usando la CLI di Ember, dov'è il posto giusto dove metterle in modo che ottengano la proprietà inizializzata? Ecco un esempio di qualcosa che mi piacerebbe fare:CLI di Ember: dove riaprire le classi di framework

import DS from 'ember-data'; 

DS.Model.reopen({ 
    rollback: function() { 
    this._super(); 
    // do some additional stuff 
    } 
}); 

risposta

22

Penso che il modo migliore per eseguire i moduli con effetti collaterali sia create an initializer. Qualcosa di simile a questo:

// app/initializers/modify-model.js 
import DS from 'ember-data'; 

let alreadyRun = false; 

export default { 
    name: 'modify-model', 
    initialize() { 
     if (alreadyRun) { 
      return; 
     } else { 
      alreadyRun = true; 
     } 

     DS.Model.reopen({ 
      // ... 
     }); 
    } 
}; 

Inizializzatori vengono automaticamente gestita da Ember-CLI, quindi non c'è bisogno di chiamare da soli.

MODIFICA: come sottolineato da Karim Baaba, è possibile che gli inizializzatori vengano eseguiti più volte. Per un modo semplice, ho incluso un flag alreadyRun.

+0

Questo sembra troppo hacky. @ La soluzione di KarimBaaba sembra più pulita. – dangonfast

+0

La soluzione di Karim Baaba funziona solo per determinati scenari, poiché non tutte le classi di framework vengono utilizzate direttamente. Inoltre ti costringe a creare nuovi alias o rinunciare agli alias predefiniti. Non sto dicendo che sia una cattiva soluzione, ma ci sono numerosi scenari in cui o non funzionerebbe o sarebbe molto ingombrante. In generale sono d'accordo con te - odio modificare la funzionalità della libreria. – GJK

4

Esporta il contenuto come un modulo ES6:

import DS from 'ember-data'; 

export default DS.Model.reopen({ 
    rollback: function() { 
    this._super(); 
    // do some additional stuff 
    } 
}); 

mettere il file con il contenuto riaprire qualche parte come app/custom/model.js, quindi importare il file in app/app.js come questo:

import SuperModel from './custom/model'; 

Ora tutti i modelli hanno il codice personalizzato.

17

L'utilizzo di un inizializzatore è sufficiente ma non è una buona pratica per scrivere i test mentre vengono eseguiti multiple times.

Ecco un esempio di come riaprire la vista campo di testo per cancellare l'ingresso quando focusIn viene attivato app/overrides/textfield.js:

import Ember from 'ember'; 

export default Ember.TextField.reopen({ 
    focusIn: function(evt) { 
    this._super(evt); 
    this.set('value', ''); 
    } 
}); 

app/app.js

import './overrides/textfield'; 

Il modello è molto semplice e può essere facilmente usato per DS.Model

+1

Dato che stai riaprendo TextField e non ne crei uno nuovo, direi che non è necessario esportarlo, il che rende le cose più chiare. Quindi la tua dichiarazione di importazione sarebbe semplicemente: 'import './overrides/textfield';'. Il vantaggio è che non stai importando un simbolo che non utilizzerai, il che è fonte di confusione. Vedi http://stackoverflow.com/a/34628888/647991 – dangonfast

+0

@gonvaled sì, ovviamente! Aggiornato. Grazie! –

+0

dove dovrei mettere il 'import './Overrides/textfield'' se sto lavorando su un addon (interno) – roberkules