내가 실수로 나는 단지 범위에 할당 된 생각 특성을 가진 서비스를 오염. 예 : 다음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와이 문제가 아니라 "블랙 박스"제공을 할 수 있습니까?
이것은 JavaScript 프로토 타입 상속이 작동하는 방식입니다. 함수는 객체입니다. 덧붙여, 프로 바이더는 싱글 톤이며, 프로 바이더를 "복제"하기 위해서'angular.copy'를 사용하면 의도하지 않은 부작용이 생길 수 있습니다. – Claies
사용자가 JS의 작동 원리를 오해하지 못하게하는 것은 프레임 워크의 책임이 아닙니다. Btw, 어떤 종류의 대답을 기대합니까? – estus
@estus 저는 여러분이 무언가를 호출하려고한다면 서비스처럼 행동해야한다고 생각합니다. 집에 우유 상자를 배달하는 서비스를 제공하고 그 상자를 가져 와서 두 병을 꺼내면 밴 안에있는 모든 상자에서 2 병을 꺼내지 않겠습니까? 요구르트 상자에 내 밴에. 내가 기대하는 대답은 스스로 볼 수없는 이익을 강조 할 수있는 것입니다. – dewd