2
最近,我一直在研究Ember.js的一些即將到來的項目。使用Ember.Router時適當架構的文檔看起來相當稀少。我注意到路由器的一件事情是,好像所有視圖都綁定到路由器上下文,而不是綁定到它們的Controller甚至View上下文。因此,action
視圖中的項目需要路由器中的方法,並且不適用於View
或Controller
對象中的方法。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
或者你可以只移動功能,對於整個方法到路由器。
這似乎是壞的體系結構,要麼複製方法簽名,要麼將傳統的控制器行爲轉移到路由中。
有沒有更好的設計模式,仍然使用路由器?