Ember.observer läuft auf init

7

Ich versuche, eine Ember-App ohne Prototyp-Erweiterungen zu erstellen, und die Ember-Dokumentation gibt Beispiele dafür, aber sie enthalten nicht das Beispiel, wenn ich möchte, dass mein Beobachter auf init läuft. Also momentan wenn mein Code so geschrieben wäre:

%Vor%

Das einzige Beispiel, das ich finden kann, um es zu schreiben, ist wie folgt:

%Vor%

Wie würde ich also sagen, dass dieser Code auf init laufen soll?

    
Taylor Hobbs 11.04.2015, 15:08
quelle

2 Antworten

10

Vielleicht suchen Sie dies

%Vor%

ODER ( dies wird Handler nicht auslösen, wenn die Änderung an init erfolgt, oben in diesem Fall verwenden )

%Vor%

In Ordnung, diese Bearbeitung zur Beantwortung der unten genannten Fehler (?)

  1. Nun, manchmal könnte es notwendig sein, Feuer zu machen der Beobachter auf Initialisierungszeit .

  2. Ember.observer ist eine Ember Namespace-Methode, nicht Teil von Ember.Object Prototyp. Daher ist this.observer niemals vorhanden, aber addObserver() funktioniert.

  3. Es ist nicht notwendig, den Handler aufzurufen, die Ember-Laufzeit ruft den Handler auf, wenn sich die Eigenschaft ändert

  4. Aufruf von this._super ist unnötig, es sei denn, es ist wirklich wichtig. In diesem Fall, wenn Person nur erweitert Ember.Object aufrufende Super tut nichts.

      

    Aktiviert standardmäßig nichts, außer es wird während der Klassendefinition überschrieben.

  5. Es ist kontextabhängig, und solange OP nichts über die Klassendefinition gesagt hat, ist es nicht möglich, darauf zu antworten.

Nichts besser erklärt als ein Beispiel

    
code-jaff 11.04.2015, 16:38
quelle
8

Die akzeptierte Antwort enthält tatsächlich fünf verschiedene Fehler unterschiedlicher Schweregrade.

  1. Es wird unnötigerweise die Einrichtung des Beobachters im init-Hook vorgenommen.

  2. Er richtet den Beobachter innerhalb des init Hooks falsch ein, indem er Ember.observer anstelle von this.observer verwendet, was nicht einmal funktioniert.

  3. Es kann den Handler bei der Init-Zeit nicht aufrufen (im Gegensatz zur Einrichtung).

  4. Es kann init in der Oberklasse nicht aufgerufen werden.

  5. Es verwendet unnötigerweise reopen .

1. Keine Notwendigkeit, den Beobachter in init hook

einzurichten

Sie benötigen keinen prozeduralen "Aufruf" oder "Aufruf" in einem Init-Hook, um einen Beobachter einzurichten. Jedes der beiden folgenden Formulare richtet sie automatisch ein, wenn das Objekt instanziiert wird.

%Vor%

2. Verwenden Sie object.observer für die prozedurale Einrichtung von Beobachtern.

Wenn Sie den Beobachter prozedural einrichten wollten, rufen Sie object.observer , nicht Ember.observer auf, was für die Verwendung wie oben definiert ist. Der Aufruf von Ember.observer procedural führt zu nichts; Ember wird keine Ahnung haben, welches Objekt die zu beobachtende Eigenschaft ist. In diesem Fall wäre es this.observer('fullName', ...) (obwohl, wie oben erwähnt, Sie dies eigentlich gar nicht tun müssen; stattdessen verwenden Sie den Ansatz von Punkt 1).

3. Handler auf init aufrufen

Sie möchten aber auch den Handler bei init time aufrufen. Es gibt drei Möglichkeiten:

%Vor%

wo die dritte Option die Prototyp-Erweiterungen verwendet, die Sie nicht möchten.

4. Aufruf von super von init

Wenn Sie einen init Hook haben, obwohl er nicht benötigt wird, müssen Sie super aufrufen, oder die Dinge werden fürchterlich ausfallen:

%Vor%

5 Keine Notwendigkeit für reopen

reopen führt hier nichts aus. Fügen Sie einfach die obigen Eigenschaften in die Klassendefinition ein.

Lösung

Die richtige Antwort auf das Äquivalent von

%Vor%

ist daher

%Vor%

Es wäre äquivalent und möglicherweise besser lesbar, dies zu tun:

%Vor%     
user663031 11.04.2015 15:30
quelle

Tags und Links