2012-07-22 45 views
2

最近,我一直在研究Ember.js的一些即將到來的項目。使用Ember.Router時適當架構的文檔看起來相當稀少。我注意到路由器的一件事情是,好像所有視圖都綁定到路由器上下文,而不是綁定到它們的Controller甚至View上下文。因此,action視圖中的項目需要路由器中的方法,並且不適用於ViewController對象中的方法。Ember.js應用程序架構與路由器,如何避免重複的方法

例(在CoffeeScript中):

window.App = Ember.Application.create { 

    ApplicationController = Ember.Controller.extend() 
    ApplicationView = Ember.View.extend 
     templateName: 'application' 

    FlavorMenuController = Ember.ArrayController.extend 
     ##Assume an extension of Ember.Object for a model called DrinkFlavors 
     content: [] 
     promoted_drink_flavor: null 

     init:() -> 
      @_super() 
      ##Assume a method actually chooses a random a drink flavor to promote 
      @choosePromotedDrinkFlavor() 

     optForNewPromotion:() -> 
      dont_include = [ @promoted_drink_flavor ] 
      @choosePromotedDrinkFlavor(dont_include) 

    FlavorMenuView = Ember.View.extend 
     templateName: 'flavor_menu_view' 

    Router: Ember.Router.extend 
     root: Ember.Route.extend 
      flavorMenu: Ember.Route.extend 
       route: '/' 
       connectOutlets: (router, event) -> 
        router.get('applicationController').connectOutlet('flavorMenu') 
} 

現在,如果我有一個模板像

<script type="text/x-handlebars" data-template-name="flavor_menu_view"> 
    <!-- ASSUME SOME VIEW STUFF HERE MAKING UP A MENU OF FLAVORS YOU CAN ORDER --> 
    <a {{action optForNewPromotion}}> Ask for another promoted Item </a> 
</script> 

行動optForNewPromotion將無法​​正常工作,並會抱怨有沒有被這個路線。如果你想要這個工作,你必須添加到路由器。

所以在路由器路徑某處你需要添加

optForNewPromotion: (router, event) -> 
    router.get('flavorMenuController').optForNewPromotion 

或者你可以只移動功能,對於整個方法到路由器。

這似乎是壞的體系結構,要麼複製方法簽名,要麼將傳統的控制器行爲轉移到路由中。

有沒有更好的設計模式,仍然使用路由器?

回答