2012-07-22 2 views
2

최근에 나는 Ember.js를 여러 가지 프로젝트에 대해 연구했습니다. Ember.Router를 사용할 때 적절한 아키텍처에 관한 문서는 드문 드문 보입니다. 라우터에 대해 알아 챘던 점 중 하나는 모든 뷰가 컨트롤러 나 뷰 컨텍스트가 아닌 라우터 컨텍스트에 바인딩되어있는 것처럼 보입니다. 따라서보기의 action 항목에는 라우터에 메소드가 필요하며 View 또는 Controller 객체의 메소드에는 작동하지 않습니다. (커피 스크립트에서)라우터가있는 Ember.js 응용 프로그램 아키텍처, 중복 된 방법을 피하는 방법

예 : 이제

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 

를 추가해야 할 것 또는 당신은 단지 라우터에 그 전체 방법에 대한 기능을 이동할 수 있습니다.

이것은 방법 서명을 복제하거나 기존 컨트롤러 동작을 경로로 옮기는 나쁜 아키텍처처럼 보입니다.

여전히 라우터를 사용하는 더 나은 디자인 패턴이 있습니까?

답변

관련 문제