2013-12-23 3 views
4

큰 앱을 만들기 위해 각도를 사용하고 컨트롤러에 대한 일반적인 방법이 있습니다. 실제로 이것을 수행하는 가장 좋은 방법은 있습니까?AngularJS 컨트롤러를 늘리십시오

app.controller('baseController', function($scope, $controller, appFactory) { 
    var $scope.foo = function() { 
     // Do something 
    } 
}); 


app.controller('childController', function($scope, $controller, appFactory) { 

    // Here i extend or something like, the base controller 

    $controller('baseController', {$scope: $scope}); 

    var $scope.bar = function() { 
     // Do a lot of things an then call foo 
     $scope.foo(); 
    } 
}): 

이 방법은 내 컨트롤러의 $ 범위가 있어야하기 때문에 사용합니다.

+1

일반적으로 일반적인 메소드는 제공자 (서비스, 팩토리, ...)에 있어야합니다. Angular는 "보기와 모델을 중재하는"얇은 컨트롤러를 중심으로 설계되었습니다. 좀 더 자세한 내용을 드릴 수 있다면 좀 더 구체적인 조언을 드릴 수 있습니다 – KayakDave

+0

이 스레드를 참조하십시오 http://stackoverflow.com/questions/16539999/angular-extending-controller – user2923779

답변

3

컨트롤러에 대해 상속을 구현하면 안된다는 위의 의견에 동의하지 않습니다. 공유 서비스/팩토리/제공자를 사용하더라도 컨트롤러 상속으로 코드가 손상되지 않는 경우가 많습니다. @ Clever의 대답의 예를 사용하면 컨트롤러 번호 X에 $scope.foo = function() { MyFactory.calculateFoo(); }을 반복하고 싶은 이유는 하나의 기본 컨트롤러에 넣을 수있는 경우입니다. 그것은 컨트롤러를 뚱뚱하게 만들지 않고 대신 그것을 청소하고 건조하게 유지합니다.

Misko 자신이 컨트롤러 상속의 가능한 구현 중 하나 인 AngularJS Google 그룹에서이 example을주었습니다. 개인적으로 나는 내 아이 컨트롤러 내에서 호출이 방법 나 자신, 간단한 예를 들어, 사용

$injector.invoke(MyBaseController, this, { $scope: $scope, alertService: alertService }); 

내 CRUD 페이지의 대부분을 나는 일반 만들고 구현하는 하나의 부모 컨트롤러가, 컨트롤러 상속을 사용하는 경우의 예/$ 범위 기능을 업데이트하십시오. 이 기본 컨트롤러는 실제 서버 호출 등을 수행하는 데 사용되는 저장소 서비스를 가져옵니다. 왜 모든 CRUD 페이지에 대해이 작업을 반복합니까?

+0

당신이 보여준 재미있는 예는 건조한 관점에서 좋은 것입니다. 그러나 얇은 컨트롤러 이상에서 쉽게 벗어날 수 있다고 생각합니다. 귀하의 구체적인 예제에서 나는 "비즈니스 로직"으로 간주하는 서버 호출을 계산합니까? 그렇다면 Angular 팀이 제공 한 조언은 비즈니스 로직이 공급자로 들어가야하며 컨트롤러의 유일한 작업은 해당 결과를보기에 매핑하는 것입니다. 멋진 아키텍처 토론! – KayakDave

+0

@KayakDave 또한이 주제가 흥미 롭습니다. 예제에서 서버 호출과 비즈니스 로직은 실제로 공급자 내에서 구현되지만 기본 컨트롤러는 제공자 기능과 결과의 일반/공유 매핑을 뷰에 구현하기 만합니다. 그래서 나는 그것이 주어진 일반적인 충고와 일치한다고 믿는다. – Beyers

+0

기본 컨트롤러에 대한 사용 사례가 표시되지 않습니다. 모델과 비즈니스 로직은 해당 리포지토리로 정의됩니다. 컨트롤러가 왜 $ scope를 생성/업데이트 했는가? 컨트롤러에 무언가를 기대하는 반복되는 구성 요소가있는 경우 템플릿의 해당 부분에 컨트롤러 또는 지시문을 포함하기 만하면됩니다. – FlavorScape

1

KayakDave가 말한 것에 대해 자세히 설명하기 위해 각도 조절기는 일반적으로 가볍습니다. 컨트롤러 내에서 "상속"이라고 생각하면 아마도 잘못했을 것입니다. 제어기간에 공유되는 공통 로직을 Service/Factory/Provider으로 추출하는 것이 좋습니다. 예 :

관련 문제