Ember.js: In einen Helfer injizieren

Erstellt am 4. Mai 2015  ·  6Kommentare  ·  Quelle: emberjs/ember.js

Ich habe das:

export function initialize(container, application) {
    application.inject('component', 'store', 'store:main');
    application.inject('component', 'application', 'application:main');
    application.inject('component', 'applicationController', 'controller:application');
    application.inject('helper', 'applicationController', 'controller:application');
    application.inject('model:device', 'application', 'application:main');
    application.inject('model:room', 'application', 'application:main');
    application.inject('model:setting', 'application', 'application:main');
    application.inject('route:application', 'application', 'application:main');
    application.inject('transform', 'application', 'application:main');
}

export default {
  name: 'injections',
  initialize: initialize
};

Notiz:

application.inject('helper', 'applicationController', 'controller:application');

aber im Helfer ist this.get('applicationController') nicht definiert:

import Ember from 'ember';
import environment from '../utils/environment';

export function staticImg(path, options) {
    if (path) {
        var staticRoot = this.get('applicationController').get('model.staticRoot');
        return new Ember.Handlebars.SafeString('<img src="' + environment.staticHost() + staticRoot + path + '" class="' + ( options.hash.classNames || "" ) + '">');
    }
    else {
        return "";
    }
}

export default Ember.Handlebars.makeBoundHelper(staticImg);

In den Dokumenten steht, dass Sie auf Helfer injizieren können, und dieses genaue Setup funktioniert auf anderen Framework-Klassen, aber nicht hier ...

Hilfreichster Kommentar

Für jeden, der später darauf stößt, sind Helfer in Ember 2.x jetzt "echte" Objekte und können auf Dienste zugreifen (über Ember.inject.service oder Initialisierungs-basierte Injektionen).

Beispiel:

export default Ember.Helper.extend({
  i18n: Ember.inject.service('i18n'),

  compute(params, hash) {
    let i18n = this.get('i18n');
    // stuff here
  }
});

Alle 6 Kommentare

Sie können nicht in Helfer injizieren. Ich glaube, dass die Dokumente aktualisiert wurden, aber bitte weisen Sie mich darauf hin, wo Sie bemerkt haben, dass dies möglich war, damit wir das Dokument reparieren können ...

Ah Mist, du hast sie für 1.11 aktualisiert. Danke. Ok, in welche Richtung sollten wir dann gehen, wenn wir von Helfern und insbesondere einfachen Ember.Object-Instanzen (die keine Containereigenschaft haben) Zugriff auf Container-Zeug benötigen?

@atomkirk Anstatt zu versuchen, etwas in einen Helfer zu injizieren, sollten Sie in einen Controller/eine Komponente injizieren und das injizierte Objekt an den Helfer übergeben (oder einfach eine berechnete Eigenschaft verwenden). Oder verwenden Sie einfach eine Komponente anstelle eines Helfers.

Was ist, wenn ich einen Helfer in der Komponente verwende und auch auf Benutzerdaten zugreifen muss, die ich normalerweise in Routen und Controller einfüge? Es ist in diesem Helfer nicht zugänglich.
Es scheint nicht effizient zu sein, es an jede Komponente weiterzugeben, ich müsste zum Beispiel user.name für jede Komponente erstellen, während es für alle gleich ist. Wenn ich also 50 Komponenten habe, müsste ich den gleichen Wert an 50 Komponenten übergeben, um vom Helfer in der Komponente darauf zuzugreifen ...
Irgendeine Möglichkeit, dies zu beheben?

Für jeden, der später darauf stößt, sind Helfer in Ember 2.x jetzt "echte" Objekte und können auf Dienste zugreifen (über Ember.inject.service oder Initialisierungs-basierte Injektionen).

Beispiel:

export default Ember.Helper.extend({
  i18n: Ember.inject.service('i18n'),

  compute(params, hash) {
    let i18n = this.get('i18n');
    // stuff here
  }
});
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen