[angularjs] AngularJS 서비스에 현재 범위 전달
$scope
AngularJS 서비스에 “현재”를 전달하는 것이 맞 습니까?
나는 $ service가 하나의 컨트롤러에서만 소비된다는 것을 알고 있고 $ service 메서드 자체에서 컨트롤러의 범위에 대한 참조를 갖고 싶습니다.
이것이 철학적으로 옳습니까?
아니면 이벤트를 $ rootScope에 브로드 캐스트 한 다음 컨트롤러가이를 수신하도록하는 것이 더 낫습니까?
답변
비동기가 발생하면 컨트롤러에 알리려면 Angular promise를 사용 하세요.
을 유발하려면 $apply
범위가 필요하지 않습니다 $rootScope.$apply
. 특정 범위 또는 루트에서 호출하는 데 차이가 없으므로을 호출 할 수 있습니다 .
변수 판독과 관련하여 매개 변수를 받으면 더 좋을 것입니다. 하지만 범위에서 객체 매개 변수로 읽을 수도 있지만 매개 변수를 사용하면 서비스 인터페이스가 훨씬 더 명확 해집니다.
답변
귀하의 기능이 서비스가 필요하지 않은 것보다 하나의 컨트롤러에만 국한되면 말할 것입니다.
컨트롤러 작업은 특정 모델을 조작하는 반면 서비스는 전역 작업을 처리해야합니다. 나는 일을 뒤섞는 것보다이 패러다임을 고수하고 싶다.
이것은 문서가 말하는 것입니다
서비스
Angular 서비스는 웹 앱에 공통적 인 특정 작업을 수행하는 싱글 톤입니다.
제어 장치
Angular에서 컨트롤러는 루트 범위를 제외한 각도 범위의 인스턴스를 늘리는 데 사용되는 JavaScript 함수 (유형 / 클래스)입니다.
추신 : 그 외에도 다이제스트가 필요한 경우 서비스 내에 $ rootScope를 삽입 할 수도 있습니다.
답변
예. 초기화 할 때 $ scope를 서비스에 전달할 수 있습니다. 서비스 생성자에서 this._scope와 같은 것에 범위를 할당 한 다음 서비스 내에서 범위를 참조 할 수 있습니다!
angular.module('blah').controller('BlahCtrl', function($scope, BlahService) {
$scope.someVar = 4;
$scope.blahService = new blahService($scope);
});
angular.module('blah').factory('blahService', function() {
//constructor
function blahService(scope) {
this._scope = scope;
this._someFunction()
}
//wherever you'd reference the scope
blahService.prototype._someFunction = function() {
this._scope['someVar'] = 5;
}
return blahService;
});
답변
개인적 $scope
으로 서비스에 전달 하는 것은 일종의 순환 참조를 생성하기 때문에 나쁜 생각 이라고 생각 합니다. 컨트롤러는 서비스에 의존하고 서비스는 컨트롤러의 범위에 의존합니다.
관계 측면에서 혼란 스러울뿐만 아니라 이와 같은 것들이 가비지 수집기를 방해하게됩니다.
내가 선호하는 접근 방식은 도메인 개체 를 컨트롤러 범위에 넣고이를 서비스에 전달하는 것입니다. 이렇게하면 서비스가 컨트롤러 내부에서 사용되는지 아니면 향후 다른 서비스 내부에서 사용되는지에 관계없이 작동합니다.
예를 들어 서비스가 array에서 요소를 푸시하고 팝해야하는 경우 errors
내 코드는 다음과 같습니다.
var errors = [];
$scope.errors = errors;
$scope.myService = new MyService(errors);
그러면 서비스는에서 작동하여 컨트롤러와 상호 작용합니다 errors
. 물론 전체 배열 참조를 지우지 않는 것에 대해주의해야하지만 결국에는 일반적인 JS 문제입니다.
나는 방송 $apply
이나 그와 비슷한 것을 사용하고 싶지 않다 . 왜냐하면 imho의 좋은 OO-practics는 Angular-magics를 항상 능가 할 것이기 때문이다.