2014-02-19 48 views
0

上transitionTo運行的業務邏輯,我有兩個不同的觀點:,我應該在Ember.js

  1. 帖子列表
  2. 名單的意見,特別柱連接

當我點擊#1視圖中的特定帖子我使用簡單的transitionTo('comments',post)顯示#2視圖。 我想要做的就是將所有與帖子相關的評論標記爲已讀,並在顯示時進行閱讀。假設我想運行方法:markAllAsRead(comment)。我應該把這個商業邏輯放在哪裏?

理想的做法是在加載時向控制器添加一些鉤子。找不到像這樣的東西,init方法僅在第一次加載#2視圖時被調用。

我可以在路由器setupController

App.IndexRoute = Ember.Route.extend({ 
    setupControler: function(controller, model){ 
    this._super(controller, model); 
    markAllAsRead(model); 
    } 
}); 

也跑這一點,但路由器並不似乎旨在使這樣的邏輯。

+0

你可以嘗試添加該行'controller.set(「模式',model)'作爲你在上面顯示的setupController鉤子的最後一行? – gravityplanx

回答

1

您可以隨時將自己的初始化函數添加到您的控制器中,例如,在您的路徑的setupController函數controller.initializeComments(model)中,並在每次加載路由時從控制器執行必要的設置。

+0

謝謝我從路由調用控制器方法。有點清潔。 – piotrze

0

請隨時以jsbin/jsfiddle爲例。它使理解你的結構,從而更容易的問題。

你應該有兩個途徑:

  • App.PostsRou​​te
  • App.CommentsRou​​te

路由器可能是這個樣子:

App.Router.map(function() { 
    this.resource('posts', function() { 
    this.resource('comments', { path: '/posts/:post_id/comments' }); 
    }); 
}); 

在模型掛鉤App.PostsController和App.CommentsController你必須加載數據。然後,您可以使用App.CommentsController上的afterModel掛鉤來操作傳遞的模型的屬性。

App.CommentsRoute = Ember.Route.extend({ 
    afterModel: function(comments, transition) { 
    comments.setEach('read', true); 
    // sets the property 'read' of all elements of the comments array to true 
    } 
}); 

文檔: