2013-01-23 125 views
1

我有一個關於Ember路由和控制器的問題。我剛寫了一個小應用程序來熟悉新的路由器。因此,我構建了一個按鈕,通過點擊它可以轉換到另一個狀態。燼新路由器

App.PostsView = Em.View.extend({ 
    click: function() { 
    var router; 
    this.get('controller').transitionTo('about'); 
    } 
}); 

我現在的問題是:什麼是get方法的返回?。顯然是PostController的一個實例,但一方面控制器沒有transitionTo()方法,另一方面沒有任何意義。

回答

3

this.get('foo')返回你的灰燼對象的屬性。由於Views可以具有「控制器」屬性,因此this.get('controller')將返回綁定到視圖控制器屬性的控制器(默認情況下爲postsController)。

this.get('controller').transitionTo()的工作原理是因爲sly7_7提到,transitionTo()也在控制器上定義並委託給路由器。請注意,它可能會被棄用,應該使用

this.get('controller').transitionToRoute('about'); 

改爲。

2

你不應該在視圖級別這樣做,這是路由器設計的目的,而不是在視圖中捕獲點擊事件,而是在按鈕上實現一個動作並讓路由器處理它。我建議你從一開始就學習最佳實踐,你的應用程序可能會發展,需要更復雜的概念,例如處理事務提交/回滾,創建/更新記錄。因此,這裏是我的建議,你

在你看來

<button type="button" {{action onSaveClick}} />Save</button> 

在你的路由器

App.FooRoute = App.Route.extend({ 
    events: { 
     onSaveClick: function() { 
      this.transitionTo('bar'); 
     } 
    } 
}) 

如果任何其他原因,說造型或動畫,你會發現自己不得不捕獲點擊事件在視圖中,然後我建議捕捉事件,執行你的樣式並最終發送一個事件給控制器。該事件隨後可以在路由器中相同的方式處理

App.FooView = Ember.View.extend({ 
click: function() { 
    // Do some styling 
    this.get('controller').send('onSaveClick') 
} 
}) 

最後發言的最佳實踐,嘗試與Ember合作,認爲你的應用程序作爲一系列狀態相互交融的時候學習。你會發現自己綁定來實現這個概念的權利。看看this

+0

首先感謝大家的快速和詳細的幫助。我只是在餘燼網站上查看文檔,在那裏我沒有找到'transitionTo'函數。 @ken謝謝你的建議,我很感激。無論如何,這只是一個適應新路由器的小練習。 –