2014-07-14 53 views
0

無法解決以下問題。無論我嘗試什麼,我都得到了Uncaught TypeError: Cannot read property 'send' of undefined。我認爲它必須是itemsViewClass中的controllerBinding,但我認爲它是正確定義的。Emberjs:如何在ItemsViewClass中實現父視圖的動作

在下面的代碼中有兩個showMenu操作。第一個工作,但itemsViewClass中的最後一個沒有。

請大家看看下面我的代碼(我只顯示相關代碼):

//views/menu.js 
import Ember from "ember"; 
var MenuitemsView = Ember.View.extend({ 
    template: Ember.Handlebars.compile('<div{{action "showMenu" target="view"}}>this works already</div>\ 
     much more code here'), 
    contentBinding: 'content', 

    itemsView: Ember.CollectionView.extend({ 
     contentBinding: 'parentView.subCategories', 
     itemViewClass: Ember.View.extend({ 
      controllerBinding: 'view.parentView.controller', // tried to add controllerBinding but did not help 
      // this is where the question is all about 
      template: Ember.Handlebars.compile('<div {{action "showMenu" target="parentView"}}>dummy</div>') 
     }), 
     actions: { 
      showMenu: function(){ 
       // dummy for testing 
       console.log('showmenu itemsView'); 
      } 
     } 
    }), 

    actions: { 
     showMenu: function() { 
      console.log('showMenu parentView!'); // how to reach this action? 
     } 
    } 
}); 

export default MenuitemsView; 

我與{{action "showMenu" target="view"}}和無目的的測試。這似乎沒有幫助。

有人有線索爲什麼第二個showMenu動作無法到達?

+1

你的語法是有點混亂。故意裏面你的行動功能看法?如果是這樣,這將是導致問題的第一件事。 –

+0

@Fishbowl,感謝您的評論。是的,我有地方特意行動我的觀點裏,我可以用到'{{行動「showMenu」}} '稱,雖然只有第二個將無法正常工作,無論我嘗試,但你覺得什麼是調用從視圖中的一個行動的最佳方法是什麼? – DelphiLynx

+1

我下面添加一個完整的響應,因爲它比多一點的解釋將適合在評論:) –

回答

1

好的,所以這絕不是只有方式在Ember中進行邏輯分離,但它是我使用的方法,似乎是整個網絡中的示例中通常使用的方法。

這個想法是將事件和動作視爲單獨的邏輯池,其中事件是DOM本身的一些操作,而動作是一種可翻譯的函數,以某種方式修改應用程序的基礎邏輯。

因此,流動會是這個樣子:

Template -> (User Clicks) -> View[click event] -> (sends action to) -> Controller[handleLogic]

的意見和控制器只有鬆散連接(這就是爲什麼你不能直接訪問從控制器的看法),所以你會需要將控制器綁定到視圖,以便您可以訪問它來執行操作。

我有給你如何使用嵌套視圖/控制器這樣一個想法的jsfiddle:

jsfiddle

如果你看的Javascript爲小提琴,它表明,如果使用視圖/控制器分離,您可以專門針對控制器使用其操作,利用控制器內的needs關鍵字。這在小提琴中的LevelTwoEntryController中演示。

在概述級別,如果綁定正確,會發生什麼情況?您是在模板上執行操作(通過在視圖中使用單擊事件處理函數或在模板本身中使用助手)發送動作到控制器模板。哪個控制器取決於你的綁定和路由是如何設置的(我已經看到了它在containerView中創建了一個模板的視圖,但控制器如果在該控制器中沒有找到該動作,它就會冒泡到路由器本身(而不是父控制器),並且路由器有機會處理行動。如果您需要在不同級別(例如父級控制器或同級)上點擊控制器操作,則可以在控制器內使用needs關鍵字(請參閱小提琴)。

我希望我已經以可理解的方式解釋了這一點。在Ember中,視圖/控制器邏輯分離和鬆散耦合困擾了我很長一段時間。這是什麼的解釋沒有做,就是解釋爲什麼你能夠使用操作處理程序在你看來,我甚至不知道這是有可能:(

+0

哇,澄清了我的一大堆!然而,還有一個問題:交出所有應該在我的視圖中應該有'controllerBinding'的行爲吧?像這樣:'{{view「menu」categoryId =「21」contentBinding =「controllers.categories」controllerBinding =「controllers.menu」}}'。我需要一個單身控制器,因爲每個菜單都有一個不同狀態的子菜單。 – DelphiLynx

+1

取決於。如果您有與各子不同的功能不同的控制器,那麼你只需要擁有正確的命名約定和鏈接會自動發生(即SubMenuView將使用SubMenuController),否則,是你必須做的controllerBinding。不幸的是,這被稱爲是錯誤的,取決於你如何做。 –

+0

謝謝,但是我有一堆關於它的問題。也許我可以僱用你一兩個小時? – DelphiLynx

相關問題