2013-06-25 2 views
1

작은 EmberJS 응용 프로그램을 만들려고하고 있지만 올바르게 구조화하는 방법에 대해 고심하고 있습니다. 사이드 바에 폴더 목록을 표시하는 "라이브러리"라는 기본보기가 있습니다. 사용자는 각 폴더를 클릭하고 가운데에 콘텐츠를 표시 할 수 있습니다 (사이드 바는 여전히 활성 상태 임).EmberJS 중첩 리소스를 구성하는 방법은 무엇입니까?

내가 그러므로이 특정 상황에서 폴더를 표시하는 라이브러리 리소스 및 중첩 된 자원이 있습니다

:

this.resource('library', function() { 
    this.resource('libraryFolders', {path: 'folders'}, function() { 
     this.resource('libraryFolder', {path: ':folder_id'}; 
    } 
}; 

부모 루트 폴더에 접근 할 수 있도록를, 나는 종속성을 설정

App.LibraryController = Ember.Controller.extend({ 
    needs: ["libraryFolders"], 

    folders: null, 
    foldersBinding: "controllers.libraryFolders" 
}); 

App.LibraryRoute = Ember.Route.extend({ 
    setupController: function(controller) { 
    controller.set('controllers.libraryFolders.model', App.Folder.find()); 
    } 
}); 

첫 번째 질문 : 이것은 좋은 방법입니까? 나는 부모 컨트롤러가 자식들에게 의존하는 것이 이상하다고 생각합니다.

다른 문제가 발생합니다. 다른 컨텍스트에서 폴더를 다시 사용하려면 어떻게해야합니까? LibraryFoldersController에서 작성하는 모든 메서드는 실제로 DRY가 아니라이 메서드에만 적용됩니다. 내가 생각해 낸 것은 루트 "폴더"리소스를 추가하고이 파일에 종속성을 추가하는 것입니다.

this.resources('folders'); 

App.LibraryController = Ember.Controller.extend({ 
    needs: ["Folders"], 

    folders: null, 
    foldersBinding: "controllers.folders" 
}); 

App.LibraryRoute = Ember.Route.extend({ 
    setupController: function(controller) { 
    controller.set('controllers.folders.model', App.Folder.find()); 
    } 
}); 

어떻게 생각하십니까? 내가 잘못하고 있니?

답변

1

IMO 지금까지 좋았습니다. 컨트롤러간에 종속성을 설정하는 올바른 (엠버) 방법 인 needs API를 사용하고 있습니다.

아마도 반복 코드를 작성하는 경우 더 일반적인 컨트롤러에 로직을 넣으려고 Mixin을 작성하는 것이 좋을 것입니다.이 로직은 처리하는 사용 사례에 대해 불가지론해야합니다. 예를 들어

mixin 정의 :

App.ControllerMixin = Ember.Mixin.create({ 
    // "use case" agnostic logic here 
}); 

당신은 .extend에 첫 번째 인수로 전달하여 클래스로 유지 mixin을 섞는다.

스 니펫 docs에서 가져온 : 언급 할 가치가

App.Person = Ember.Object.extend({ 
    helloWorld: function() { 
    alert("Hi, my name is " + this.get('name')); 
    } 
}); 

var tom = App.Person.create({ 
    name: 'Tom Dale' 
}); 

tom.helloWorld(); // alerts "Hi, my name is Tom Dale". 

한 가지

App.LibraryController = Ember.ObjectController.extend(App.ControllerMixin, { 
    // now you can use here the logic defined in your mixin 
    // and add custom code as you please 
}); 

또 다른 가능성은 공통의 논리를 상속 슈퍼 클래스를 작성하고 확장하는 것입니다 (비록 내가 단순히 오타라고 생각한다) : needs: ["Folders"]needs: ["folders"],

가되어야한다.

희망이 있습니다.

+0

감사합니다. 믹스 인 접근 방식에 대해 생각하지 않았습니다.이 내용은 조금 더 읽을 필요가 있습니다. 첫 번째 접근 방식에 대한 주요 관심사는 나에게 이상한 소리를내는 어린이 컨트롤러에 의존하는 것이 었습니다. –

관련 문제