2014-10-06 3 views
1

내가 재생 구성 요소가있는 독립형 부가 기능이 있다고 가정하자 백엔드와 독립적으로 작업하고 모든 작업을 내부적으로 처리합니다. 소비 작업의 컨트롤러/라우트를 만질 필요가 없도록하려면이 두 작업 (예 : recordPlayrecordStop)을 addon 자체에서 처리하려면 어떻게해야합니까?를 주입 컨트롤러 액션 엠버 부가 기능 내에서

이 나는 ​​시도했다 :

  • 이 애드온 예를 들어 내 응용 프로그램 컨트롤러를 생성. `/app/controllers/application.js - 이것은 결코 호출되지 않습니다

  • addon 내에서 응용 프로그램 경로를 생성합니다. `/app/routes/application.js은 - 응용 프로그램을 소모하기는 부가 기능의 경로 우선

내가와 ApplicationController 이러한 두 가지 작업을 주입하는 부가 기능 내에서 어떻게 든 이니셜 라이저를 사용할 수있는 자신의 ApplicationRoute입니다하지 않는 한,이 호출된다?

편집 : 더러운 해결 방법을 사용하여 ApplicationRoute._actions

/app/initializers/record.js

export default { 
    name: 'record', 

    initialize: function(container, app) { 

    var applicationRoute = container.lookup('route:application'); 

    applicationRoute._actions.recordPlay = function(id) { 

     console.log('CALLED recordPlay', id); 
    }; 

    applicationRoute._actions.recordStop = function(id) { 

     console.log('CALLED recordStop', id); 

    }; 
    } 
}; 
+0

왜 인덱스 컨트롤러에서 구현을 강제로 수행하고 구성 요소에서 처리하지 않을까요? 색인 컨트롤러/경로는 응용 프로그램의 루트에있을 때만 사용됩니다. – Kingpin2k

+0

이 @ Kingpin2k을 찾아 주셔서 감사합니다. 내 지식 구성 요소에 외부 단어를 인식해서는 안됩니다 - 따라서 매장, ember 데이터, API 등 상호 작용해서는 안됩니다. 아니면 내가 여기에 몇 가지 개념을 놓치고? – WooDzu

+0

ActionController에 액션을 주입하는 아이디어는 트리거 된 액션이 현재 루트가 무엇이든간에 루트 트리를 움직일 수 있다는 것입니다. 그러나 필요한 경우 경로/자원을 통해 중간 경로를 파악할 수 있습니다. – WooDzu

답변

0

당신이 거의 모순 제약 조건을 충족하기 위해 고군분투 것 -이 당신을 강제로 아마 당신의 제약을 위반하는 것보다 나쁜 해결책으로

제약 조건은 다음과 같습니다. (1) 외부 세계를 인식하지 못하는 구성 요소이지만 (2) 전체적으로 추가 기능이 자발적으로 백엔드와 상호 작용합니다.

그러면 구성 요소가 원하는 신호를 보내고 추가 기능이 기본 작동 방식을 제공하기를 원합니다.

외부 세계를 인식하지 못한 구성 요소의 개념은 다른 상황에서 사용할 수 있다는 것입니다. 애드온 외부에서 컴포넌트를 사용하는 것이 현실적인가요? "기본 작업 방식"이 구워 지길 원하는 것 같습니다.

청사진을 사용하여 구성 요소에 어댑터를 삽입하는 것이 좋습니다. 그런 다음 어댑터는 상점 (etc?)과 상호 작용합니다. 그러나 소비자가 다르게 작업하기를 원할 경우 어댑터를 정의하고 대신 동작을 정의하거나 다른 어댑터를 사용할 수 없습니다.

+0

흥미로운 아이디어, 나는 접근 방법을 잘 모르겠습니다.참조 할 수있는 예제가 있습니까? 감사합니다 – WooDzu

+0

실제로 그것을 시도하지 않았습니다 - 그리고 스프린트 중간에, 그래서 실험 할 시간이 없어. 그러나, 아이디어는'this.recorderAdaptor'에 대한 컴포넌트 체크 - 발견되면 필요로하는 것을 알려줍니다. 그렇지 않으면 (또는 추가로)'sendAction (...) '을 호출합니다. 자동 구성을 원하지 않으면 recorderAdaptor를 삽입하는 대신 "recorderAdaptor"를 템플릿으로 구성 할 수있는 속성으로 지정할 수 있습니다. (사실, 당신은 단지 "recordPlayCallback"과 같은 콜백을 가질 수 있습니다.) 조금 우아하지만 이제는 "recorderAdaptor", 전역 적으로/주입 또는 로컬로 오버라이드로 전환 가능합니다. – shaunc