2015-10-25 14 views
5

私はember-cli 1.13.8を使用しており、私のロジックのほとんどを処理するサービスを持っています。今、私は、特定のものが真実か偽かを聞いて、それに基づいて経路を変更できる機能を持っています。むしろすべてのルートでその機能を呼び出す必要はないので、すべてのルート内でその機能を呼び出す必要はありません。その目標は、プレイヤーが獲得したかどうか、そしてゲーム内のすべてのやり取りがこれを推進するかどうかを判断することです。私のゲームサービスの内部Emberのサービス内でルートを遷移させることはできますか?

thisはエンバー期待するような経路ではないので、もちろん

init() { 
    ... 
    if(true) { 
    console.log("you've won!"); 
    this.transitionTo("congratulations"); 
    } 
}, 

、これは失敗します。私は代わりにすべてのルートの内側からこのメソッドを呼び出すことができます知っているが、私はこれを行うより良い方法があるかどうか疑問に思っています。

おかげ

編集

これまでのところ私は、Appにインポートして、ルータを拡張しようと試みました。しかしこれは悪い考えのようです。

答えて

23

あなたは(プライベートAPIである)ルーティングサービスを使用することができます:エンバー2.15のよう

routing: Ember.inject.service('-routing'), 

init() { 
    ... 
    if(true) { 
    console.log("you've won!"); 
    this.get("routing").transitionTo("congratulations"); 
    } 
}, 
+0

うわー、[OK]を、私はこれをしようとする必要があります。私はこれを知らなかった。 – user3162553

+0

それは動作します!正確に私が必要としたもの。 – user3162553

+0

これはember 2.xで動作しますか? Ember 2.4.0ではルーティングが定義されていないと言っています。 – mikeLspohn

9

を、まさにこのユースケースのための公共routerサービスがあります。 Emberクラスにrouter: Ember.inject.service(),を追加してthis.get('router').transitionTo(...);と簡単に電話してください。


一般的にこれは悪い考えですが、場合によっては100か所(個人的な経験)のルートアクションを通過するよりも簡単です。

どこからでもこれを行うには良い方法は、コンテナの上にルータをルックアップするためにです:

Ember.getOwner(this).lookup('router:main').transitionTo(...); 

thisは、一部のコンテナは、コンポーネント、サービス、およびエンバーデータモデルが含まエンバーオブジェクトを、割り当てられる必要があります。

これをたくさん呼び出す場合は、ルーターをプロパティとして保存することをお勧めします。あなたはinitフックでこれを行うことができます。

init() { 
    this._super(...arguments); 
    this.set('router', Ember.getOwner(this).lookup('router:main')); 
} 
... 
this.get('router').transitionTo(...); 

Ember.getOwner(this)作品をEmber 2.3+で、その前にあなたの代わりにthis.get('container')を使用することができます。

+0

ルックアップはコストがかかるので、可能であれば、この[link]で提供されているgraphoの提案で回答を更新してくださいhttps://gist.github.com/grapho/dfa357c63ab3b6c87970d0804a49efd4) – kumkanillam

+0

非常に良い点、ありがとうございます。 – DuBistKomisch

0

エンバー1.13:

ルーティングと呼ばれる別のサービスを作成します。

import Ember from 'ember'; 

export default Ember.Service.extend({ 
    _router: null, 

    init() { 
     this._super(); 

     this.set('_router', this.get('container').lookup('router:main')); 
    }, 

    transitionTo() { 
     this.get('_router').transitionTo(...arguments); 
    } 
}); 

を次に、あなたがすることができます:

routing: Ember.inject.service(), 

goSomewhere() { 
    this.get('routing').transitionTo('index'); 
} 
関連する問題