2013-04-15 7 views
6

レンダリング後にいくつかの共通のアクションを適用するためにルート変更を監視しようとしています。このアイデアは、onloadと似た機能を持たせることですが、単一ページのアプリケーションを使用する場合は、各ルートの変更時にトリガーする必要があります。オンロードに相当する適用範囲を変更する

を(新しいビューにスコープすることができる)私は、電流経路の変化を観察する方法が見つかりました:これは、いくつかのケースでは良い動作しますが、それは時にルート変更トリガます

App.ApplicationController = Ember.Controller.extend({ 
    currentPathDidChange: function() { 
    prettyPrint() 
    }.observes('currentPath'); 
}); 

、まだへの早期にコンテンツがレンダリングされる前に追加されるようにコンテンツの変更を適用します。

このような目標を達成するためのベストプラクティスはありますか?

+2

私は答えを残しましたが、多くの場合、実際には、DOMを悩ますためにビューを待たなければならない場合、それは実際にはアンチパターンです。おそらく、いくつかのビューの 'didInsertElement'のように、あなたがやっているどんなDOM操作を置くのが良いでしょうか? –

+0

ビューを実装する場合は、['didInsertElement']で行うことができます(http://emberjs.com/api/classes/Ember.View.html#event_didInsertElement) – MilkyWayJoe

答えて

12

Ember.run.scheduleでコードを延期しようとしましたか?たとえば、ルータのURLを見つけるためdeprecation of Controllers in Ember 1.x

App.ApplicationController = Ember.Controller.extend({ 
    currentPathDidChange: function() { 
    Ember.run.schedule('afterRender', this, function() { 
     prettyPrint(); 
    }); 
    }.observes('currentPath') 
}); 
+0

ありがとう!これは私のために働いた。 – John

0

将来性アプリに良い方法でしょう。あなたはそのようember-cliでこれを行うことができます。これは、ログに記録されます

// similar to onLoad event behavior 
export default Ember.Route.extend({ 
    afterModel: function (model){ 
    Ember.run.next(() => { 
     console.log(this.get('router.url')); 
    }); 
    } 
}); 

// hacky way to get current url on each transition 
export default Ember.Route.extend({ 
    actions: { 
    didTransition: function() { 
     Ember.run.next(() => { 
     console.log(this.get('router.url')); 
     }); 
    } 
    } 
}); 

/posts/posts/3/comments電気ショック療法。

+0

推奨されていないページでは、コントローラの使用は推奨されていません。単に 'ArrayControllers'と' ObjectControllers'ですが、すべてのコントローラではありません。 – mikefrey

+0

それは本当ですが、最終的にはこのロジックはルーティング可能なコンポーネントまたはルートのいずれかになります。現在のところ、(1.13.6)廃止警告なしで 'Controller'を使用することはできますが、Ember 2(現在はベータ版)で変更される可能性があります。 –

関連する問題