2014-11-26 2 views
23

Ich möchte Ember Ember oder Daten Framework-Klassen wieder zu öffnen. Verwenden Sie Ember CLI, wo ist der richtige Ort, um diese zu platzieren, damit sie initialisiertes Eigentum bekommen? Hier ist ein Beispiel für etwas, Ich mag würde tun:Ember CLI: wo Framework-Klassen wieder zu öffnen

import DS from 'ember-data'; 

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

Antwort

22

Ich denke, die beste Art und Weise Module auszuführen, die Nebenwirkungen zu create an initializer wären. Etwas wie folgt aus:

// 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({ 
      // ... 
     }); 
    } 
}; 

Initializers werden automatisch ausgeführt von Ember-CLI, so gibt es keine Notwendigkeit, sie selbst zu nennen.

EDIT: Wie Karim Baaba darauf hingewiesen, es ist möglich, initializers mehr als einmal zu laufen. Für eine einfache Möglichkeit, habe ich eine alreadyRun Flag enthalten.

+0

Dies scheint auch hacky. @ KarimBaaba Lösung scheint sauberer. – dangonfast

+0

Die Lösung von Karim Baaba funktioniert nur für bestimmte Szenarien, da nicht alle Framework-Klassen direkt verwendet werden. Außerdem müssen Sie entweder neue Aliase erstellen oder auf die integrierten Aliase verzichten. Ich sage nicht, dass es eine schlechte Lösung ist, aber es gibt zahlreiche Szenarien, in denen es entweder nicht funktioniert oder sehr umständlich wäre. Im Allgemeinen stimme ich Ihnen zu - ich hasse es, Bibliotheksfunktionen zu ändern. – GJK

4

Exportieren Sie Ihre Inhalte als ES6 Modul:

import DS from 'ember-data'; 

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

Stellen Sie die Datei mit Ihrem wieder öffnen Inhalt irgendwo wie app/custom/model.js, importieren Sie dann die Datei in app/app.js wie folgt aus:

import SuperModel from './custom/model'; 

Jetzt sind alle Ihre Modelle haben den benutzerdefinierten Code.

17

eine initializers Verwendung ist ausreichend, aber ist keine gute Praxis für das Schreiben von Tests, wie sie multiple times lief sind. Hier

ist ein Beispiel dafür, wie das Textfeld Ansicht wieder zu öffnen, um die Eingabe zu löschen, wenn focusIn ausgelöst wird 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'; 

Das Muster ist sehr einfach und kann leicht sein verwendet für DS.Model

+1

Da Sie gerade die Wiedereröffnung TextField- sind und keine neuen zu erstellen, würde ich sagen Sie es nicht exportieren müssen, die Dinge klarer macht. Dann wäre Ihre Importanweisung nur: 'import './overrides/textfield';'. Der Vorteil ist, dass Sie kein Symbol importieren, das Sie nicht verwenden werden, was verwirrend ist. Siehe http://stackoverflow.com/a/34628888/647991 – dangonfast

+0

@gonvaled ja, natürlich! Aktualisiert. Vielen Dank! –

+0

wo würde ich den 'import './Overrides/textfield'' setzen, wenn ich an einem (internen) Addon arbeite – roberkules