javascript - 带路由器的Ember.js应用架构,如何避免方法重复

标签 javascript model-view-controller architecture ember.js

最近我一直在为一些即将进行的项目研究 Ember.js。有关使用 Ember.Router 时正确架构的文档似乎相当稀疏​​。关于路由器,我注意到的一件事是,似乎所有 View 都绑定(bind)到路由器上下文,而不是它们的 Controller 甚至 View 上下文。因此, View 中的 action 项需要路由器中的方法,并且不适用于 ViewController 对象中的方法。

示例(在 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

或者您可以将整个方法的功能移至路由器中。

这似乎是一个糟糕的架构,要么重复方法签名,要么将传统 Controller 行为移动到路由中。

是否有更好的设计模式仍然使用路由器?

最佳答案

这篇文章Ember.js Router Action to Controller回答了问题。

使用{{action "foo"target="controller"}} 调用

关于javascript - 带路由器的Ember.js应用架构,如何避免方法重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11601104/

相关文章:

javascript - Jquery Prop 功能未按预期工作

JavaScript:CSS 选择语法

ruby-on-rails - 包含/使用 "partial view"时的最佳实践?

c# - 影院预约系统架构

asp.net-mvc - "inheriting"来自通用模板应用程序的 ASP.NET MVC 站点? ( Multi-Tenancy )

javascript - D3刷(多刷)

javascript - 如何在 ng-view (angularjs) 中使用常规 javascript 代码

angularjs - polymer |如何在铁组件页面上加载多个源?

asp.net-mvc - asp.net mvc 多语言 url 通过更改 url 重定向

.net - 什么对象应该从数据访问层返回到业务层一个n层系统