2016-08-14 4 views
0

Ich habe State-Eigenschaften vom Controller zu Service außer QueryParams verschoben. jetzt möchte ich eine der query param property zu bedienen haben.
Gibt es eine Möglichkeit, dies ohne Beobachter zu erreichen?Beobachten Controller-Eigenschaft (Teilnahme an Abfrageparam) aus Service ohne Beobachter

Ich mache es gerade mit Beobachter.

Controller/application.js

import Ember from 'ember'; 
const {computed,observer} = Ember; 
export default Ember.Controller.extend({ 
    myService:Ember.inject.service(), 
    appName: 'Ember Twiddle', 
    changedAppName:observer('appName',function(){ 
    this.get('myService').changeAppName(this.get('appName')); 
    }), 
    actions:{ 
    changeApp(){ 
     this.set('appName','NewEmberApp'); 
    } 
    } 
}); 

templates/application.hbs

<h1>Welcome to {{myService.appName}}</h1> 
<br> 
<button {{action "changeApp"}}>Change</button> 
<br> 
{{outlet}} 
<br> 
<br> 

Dienste/my-service.js

import Ember from 'ember'; 

export default Ember.Service.extend({ 
    appName:'SSS', 
    changeAppName(param){ 
    this.set('appName',param); 
    } 
}); 

EmberTwiddle

Antwort

1

Warum brauchen Sie den Beobachter überhaupt? Setzen Sie den appName des Dienstes direkt in Ihrer ChangeApp-Aktion des Controllers: this.set('myService.appName','Kumkanillam'); und entfernen Sie den Beobachter vollständig.

Ihre Frage wurde zu etw. anders nach deinem Kommentar. Lassen Sie mich klären, ob ich Ihre Frage richtig verstanden habe mit den folgenden twiddle. In diesem Fall; Sie ändern appName sowohl auf dem Controller als auch auf der Komponente. was eine Veranschaulichung der Verletzung des DDAU-Prinzips ist. In diesem Fall benötigen Sie einen Beobachter innerhalb des Controllers, um über den appName-Wechsel auf Komponentenebene benachrichtigt zu werden.

Um dieses Problem zu lösen; Sie können eine Alias-berechnete Eigenschaft auf Controller-Ebene erstellen und diese an die Komponente (oder andere Komponenten oder Routenvorlagen) übergeben, und Sie werden den Beobachter los. Diese twiddle erklärt was ich meine.

Auch wenn das, was ich verstanden habe, richtig ist und was ich zur Verfügung stellte, könnte eine gültige Antwort sein; Vergessen Sie nicht, dass das Verletzen von DDAU Sie irgendwann verletzen wird und Sie Ihren Code in Zukunft neu gestalten müssen. Hoffe das hilft.

+0

Ich bin bewusst, Service-Eigenschaften von Controller einstellen. viele der Orte, die ich appName Eigenschaft ändern, um wiederholten Code der Einstellung Service-Eigenschaft zu vermeiden, ich benötige einige Mechanismen, die automatisch kümmert sich um die Zuordnung appName Controller-Eigenschaft zu service.Currently habe ich nicht DDAU Prinzip folgen, so dass diese Eigenschaft geändert werden kann viele andere Orte ... – kumkanillam

+0

Ich habe die Antwort nach dem Lesen Ihres Kommentars geändert; denn dein Problem unterscheidet sich von dem, was ich am Anfang verstanden habe. – alptugd

+0

Also sollte ich 'appName' nicht direkt im Controller ändern, sollte ich immer durch Dienste kommen. habe ich recht ? – kumkanillam

Verwandte Themen