最近、私はいくつかの今後のプロジェクトのためにEmber.jsを研究しています。Ember.Routerを使用する際の適切なアーキテクチャに関するドキュメントはかなりまばらに見えます。ルーターについて私が気づいたことの1つは、すべてのビューがコントローラーやビューコンテキストではなく、ルーターコンテキストにバインドされているように見えることです。したがって、ビュー内のアイテムにはルーター内のメソッドが必要であり、またはオブジェクトaction
内のメソッドでは機能しません。View
Controller
例(コーヒースクリプト):
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
または、そのメソッド全体の機能をルーターに移動することもできます。
これは、メソッドシグネチャを複製するか、従来のコントローラーの動作をルートに移動するための悪いアーキテクチャのようです。
ルーターをまだ利用しているより良いデザインパターンはありますか?