최근에 나는 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
를 추가해야 할 것 또는 당신은 단지 라우터에 그 전체 방법에 대한 기능을 이동할 수 있습니다.
이것은 방법 서명을 복제하거나 기존 컨트롤러 동작을 경로로 옮기는 나쁜 아키텍처처럼 보입니다.
여전히 라우터를 사용하는 더 나은 디자인 패턴이 있습니까?