0

내가 실수로 나는 단지 범위에 할당 된 생각 특성을 가진 서비스를 오염. 예 : 다음AngularJS와 - 공해를 제공, 서비스 및 공장 외부

var ServiceFunction = function ServiceFunction(){ 
    this.greeting = 'Hello'; 
}; 

var TestController = function TestController(testService){ 
    var testCtrl = this; 
    testCtrl.testService = testService; 

    //here I make changes within the controller. This amends the service itself 
    testCtrl.testService.newProperty = 'new value'; 
}; 

angular.module('test',[]) 
.service('testService',ServiceFunction) 
.controller(['testService',TestController]) 

는 Plunker이 동작을 보여하는 것입니다

https://plnkr.co/edit/nDkNfKmQRtcBuJ0NUcHo?p=preview

나는 그것이 기능에 객체를 전달에 올 때 자바 스크립트를 참조에 의해 통과 것을 알고있다. 이러한 객체가 깊이 복제되지 않은 경우입니다.

나는 서비스 밖에서 무언가가 그 서비스 만 값에 의해 노출 된 객체 등에 액세스 할 것이라고 가정했고, 그 서비스에 대한 변경은 해당 서비스에서 제공하는 API에 의해 수행되어야 할 것이다. 이를 수행하는 유일한 방법은 angular.copy을 사용하는 것입니다. 위의 예 testCtrl.testService = angular.copy(testService);

에 나는이 반드시 구성되어야 동작을 같은데요. 그렇다면 성능상의 이점을 제외하면이 점이 단점이라고 생각합니다.

이유 AngularJS와이 문제가 아니라 "블랙 박스"제공을 할 수 있습니까?

+0

이것은 JavaScript 프로토 타입 상속이 작동하는 방식입니다. 함수는 객체입니다. 덧붙여, 프로 바이더는 싱글 톤이며, 프로 바이더를 "복제"하기 위해서'angular.copy'를 사용하면 의도하지 않은 부작용이 생길 수 있습니다. – Claies

+0

사용자가 JS의 작동 원리를 오해하지 못하게하는 것은 프레임 워크의 책임이 아닙니다. Btw, 어떤 종류의 대답을 기대합니까? – estus

+0

@estus 저는 여러분이 무언가를 호출하려고한다면 서비스처럼 행동해야한다고 생각합니다. 집에 우유 상자를 배달하는 서비스를 제공하고 그 상자를 가져 와서 두 병을 꺼내면 밴 안에있는 모든 상자에서 2 병을 꺼내지 않겠습니까? 요구르트 상자에 내 밴에. 내가 기대하는 대답은 스스로 볼 수없는 이익을 강조 할 수있는 것입니다. – dewd

답변

0

AngularJS가 서비스에 액세스하기 위해 API로만 캡슐화되지 않은 것 이외에 AngularJS가 이러한 동작을 허용하는 구체적인 이유는 없습니다.

자바 스크립트 등의 일반 규칙이 적용될 때, 즉, 서비스 기능, 예를 들어에 전달 directive, controller은 서비스 개체에 대한 참조로 전달되며 해당 참조에 대한 변경 사항은 원본에서 직접 개체를 업데이트합니다. 서비스는 싱글 톤이기 때문에 서비스가 사용되는 앱 전체에 변경 내용이 반영됩니다. 그것은 자연 자바 스크립트 동작이기 때문에

는이 방법에 성능상의 이점이 있습니다.

관련 문제