2012-08-09 46 views
7

我有一個視圖具有可擴展/可摺疊的內容,我希望能夠通過單擊表格行進行切換。處理操作在視圖中不是路由器

<tr {{action "expand"}}> 

這是以前對我的看法處理:

App.ContentRowView = Em.View.extend({ 
    templateName: 'ember/templates/content/row', 
    expand: function() { 
     this.set('isExpanded', !this.get('isExpanded')); 
    }, 
    isExpanded: false 
}); 

然而,升級到pre1.0動作後,現在由直接派出pre1.0之前,我在模板裏有這路由器。這在很多情況下都有意義,但在這種情況下,擴展真的是一個關注的問題。我試過用一個點擊事件處理程序替代它,但沒有運氣。

是否有關於如何處理視圖關注的事件是這樣用pre1.0最好的做法?

回答

20

棄用回答


即使答案@ outside2344作品,我認爲它不完全正確。 確實parentView不代表該視圖,而是其父視圖的父視圖。 由於1.0 - 前,視圖維護他們的上下文中,因此在模板,this表示parentView,parentView表示parentView.parentView,和view表示當前視圖。 下面是說明這一個小提琴:http://jsfiddle.net/Sly7/cnmJa/

對我的回答是{{action expand target="view"}}

編輯(應答到@Gal本哈伊姆)

動作助手的行爲稍有不同在基於路由器的應用。從文檔引用:

在路由器驅動的應用程序,如果一個動作不是由視圖截獲,該事件將冒泡到路徑,其中該視圖被渲染。如果該路線是另一路線的子路線,則將在該路線上一直尋找到達頂層路線定義,即我們的über-container:root。

這種冒泡效果允許某些操作保持私密。如果某些轉換隻適用於某些子子狀態,則將轉換置於子狀態,並且已經實現了一種範圍界定。

基本上,我在路由器型應用意味着,如果你不明確定義的動作助手的目標,它被髮送到路由器。


更新答案

我覺得現在的導遊回答得非常好了這個問題。請參閱http://emberjs.com/guides/templates/actions/#toc_specifying-a-target

+0

路由器文檔http://emberjs.com/guides/router_primer/#toc_navigation清楚地講述了視圖處理的事件和直到路由器的冒泡效果。我不明白爲什麼這不起作用,一切都直接發送到路由器,或者文檔錯誤/過時? – 2012-12-12 21:50:43

+0

我編輯了我的答案qutoing文檔。 – 2012-12-13 07:43:58

+1

很好回答,這是一個混淆的點... – hagope 2013-02-06 16:37:23

1

在pre1.0您可以通過添加目標= 「parentView」 的動作的動作使視野:

{{action "expand" target="parentView"}} 
+1

你也可以換目標(如果你有多個動作和/或綁定),使用單個對象/視圖' {{帶}}聲明。 – SciSpear 2012-08-09 16:40:57

1

默認情況下,事件不會通過視圖層次結構冒泡。你可以改變這一點(雖然我不能說我會推薦它):

(function() { 
    Ember.View.reopen({ 
     // Let actions bubble to parentView by default. 
     target: function() { 
      return this.get('parentView'); 
     }.property('parentView') 
    }); 
})();