2016-08-14 2 views
0

queryParamsを除くコントローラからサービスに状態プロパティを移動しました。今私は、サービスするクエリのparamプロパティの1つを持っていると思います。
オブザーバーを使用せずにこれを達成する方法はありますか?オブザーバなしのサービスからコントローラープロパティ(queryparamに参加しています)を確認します

私は現在、オブザーバーを使用しています。

コントローラ/

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'); 
    } 
    } 
}); 

テンプレートをapplication.js/

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

サービス/ MY-service.js

import Ember from 'ember'; 

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

EmberTwiddle

答えて

1

なぜあなたはオブザーバーをまったく必要としますか?コントローラのchangeAppアクションの中にサービスのappNameを直接設定するだけです:this.set('myService.appName','Kumkanillam'); そしてオブザーバを完全に削除してください。

あなたの質問はsthになりました。あなたのコメントの後に別の。 twiddleで質問を正しく理解しているかどうかを明確にしてください。その場合、コントローラとコンポーネントの両方でappNameを変更しています。これはDDAUの原則違反の実例である。このような状況では、コンポーネントレベルでのappNameの変更について通知を受けるために、コントローラ内にオブザーバが必要です。

この問題を解決するために、コントローラーレベルでエイリアス化された計算済みプロパティーを作成し、それをコンポーネント(または他のコンポーネントやルートテンプレート)に渡すと、オブザーバーを取り除くことができます。このtwiddleは、私が意味することを説明しています。

私が理解したことは正しいものであり、私が提供したものが有効な回答かもしれません。違反しているDDAUがある時点であなたを傷つけ、今後あなたのコードをリファクタリングする必要があることを忘れないでください。お役に立てれば。

+0

私は、コントローラからサービスプロパティを設定しています。私はappNameプロパティを変更している場所の多くは、サービスプロパティを設定するための繰り返しコードを避けるために、私は自動的に関連付けられているappNameコントローラのプロパティを処理するいくつかのメカニズムを必要とします。現在、私はDDAUの原則に従わず、多くの他の場所... – kumkanillam

+0

私はあなたのコメントを読んだ後に答えを修正しました。あなたの問題は私が最初に理解したものとは異なるからです。 – alptugd

+0

私は 'appName'をコントローラで直接変更すべきではありません。私は正しい? – kumkanillam

関連する問題