2013-09-06 5 views
1

응용 프로그램 컨트롤러에서 일부 동작과 계산 된 속성을 설정하고 다른 컨트롤러에서 계산 된 속성을 사용하려면 다른 모든 컨트롤러에서이 속성을 수동으로 설정해야합니다.Ember의 모든 컨트롤러에 계산 된 속성을 주입하는 방법은 무엇입니까?

App.ApplicationController = Ember.Controller.extend 
    isOn: true 
    actions: 
    on: -> 
     this.set('isOn', true); 
    off: -> 
     this.set('isOn', false); 

App.IndexController = Ember.Controller.extend 
    needs: ['application'] 
    isOn: Ember.computed.alias("controllers.application.isOn") 

2 질문 :

  • 가 어떻게이 주입 수를 자동으로 생성되는 모든 컨트롤러에

    이것은 내가 지금 뭐하는 거지 어떻게?

  • Ember에서 전역 작업/속성을 구현하는 가장 좋은 방법입니까?

답변

1

reopenClass을 사용하면 Ember.Controller을 다시 열고 필요한 부분을 확장 할 수 있습니다. 방금 jsfiddle에서 시도해 보니 작동하지 못했습니다.

내가 일을 한 것은 Ember.Mixin입니다.

App.IsOn = Ember.Mixin.create({ 
    needs: ['application'], 
    isOn: Ember.computed.alias("controllers.application.isOn") 
}) 

App.IndexController = Ember.Controller.extend(App.IsOn,{}); 

그것은 자동으로 생성 된 컨트롤러를 처리하지 않습니다,하지만 당신이 무엇을위한 컨트롤러가 필요하지 않은 경우 당신은 단지 하나의 선으로 컨트롤러에 기능을 넣어 보자 않습니다.

여기에 모든 것을 작업과 jsfiddle입니다 :

http://jsfiddle.net/DqeLv/

편집 : 나는 또한 당신의 ApplicationRoute 대신 ApplicationControllertoggleOn 방법을하려는 추가해야합니다. 이벤트의 버블 링은 가장 구체적인 컨트롤러에서부터 해당 컨트롤러의 루트까지, 각 연속적인 상위 루트까지 (컨트롤러가 아닌) 진행됩니다. 그래서

은 갈 것입니다 당신이 "https://stackoverflow.com/users/new"에있어 및 작업을 트리거 대답 :

UsersNewController =>UsersNewRoute =>UsersRoute =>ApplicationRoute

편집 # 2 : OK, 잠을 점점 후 reopen을 작동시켜 자동 생성 컨트롤러가 isOn 속성을 자동으로 가져올 수있었습니다.

Ember.Controller.reopen({ 
    needs: ['application'], 
    isOn: Ember.computed.alias("controllers.application.isOn") 
}); 

는 단지 (단지 model 반환하지 않는 경로에 대한)하지 ArrayController 또는 ObjectController의 인스턴스에 대한 "일반적인"컨트롤러 작동 것으로 보인다.

당신이 자동으로 작동하려면

ArrayControllerObjectController 인스턴스 할 수 있습니다 reopen 두 클래스를 생성합니다. 응답에 대한

Ember.ArrayController.reopen({ ... }) 

http://jsfiddle.net/HTPaF/2/

+0

감사합니다! 나는'Ember.Application.initializer'가 더 좋은 방법일지도 모른다고 생각하고 있습니다 만,'injection'이나'typeInjection' 함수로 동작시키지 못했습니다.당신이 이것에 대한 어떤 생각을 가지고 있다면, 그들은 높이 평가 될 것이지만, 나는 아직 대안을 볼 수없는 당신의 답을 정확한 것으로 표시했습니다. – cdaloisio

관련 문제