2

最近、私はいくつかの今後のプロジェクトのためにEmber.jsを研究しています。Ember.Routerを使用する際の適切なアーキテクチャに関するドキュメントはかなりまばらに見えます。ルーターについて私が気づいたことの1つは、すべてのビューがコントローラーやビューコンテキストではなく、ルーターコンテキストにバインドされているように見えることです。したがって、ビュー内のアイテムにはルーター内のメソッドが必要であり、またはオブジェクトaction内のメソッドでは機能しません。ViewController

例(コーヒースクリプト):

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

または、そのメソッド全体の機能をルーターに移動することもできます。

これは、メソッドシグネチャを複製するか、従来のコントローラーの動作をルートに移動するための悪いアーキテクチャのようです。

ルーターをまだ利用しているより良いデザインパターンはありますか?

4

1 に答える 1

2

この投稿Ember.jsルーターアクションからコントローラーへの質問に答えます。

{{action "foo" target="controller"}}電話を使う

于 2012-07-22T17:27:57.963 に答える