동일한 서비스에서 AngularJS 서비스의 함수를 호출합니까?
다음과 같은 방식으로 정의 된 AngularJS 서비스가 있습니다.
angular.module('myService').service('myService', function() {
this.publicFunction(param) {
...
};
this.anotherPublicFunction(param) {
// how to call publicFunction(param)?
...
};
});
서비스 외부 (에서 잘 작동 함 myService.publicFunction(xxx)
)와 동일한 서비스의 다른 함수 (예 :) 에서 첫 번째 함수를 호출하고 싶습니다 anotherPublicFunction
.둘 중 하나 this.publicFunction(param)
또는 myService.publicFunction(param)
두 번째 함수 내에서 작동하지 않습니다, 나는 그것을 이해할 수있다.
편집 :
사실 내 예제만으로는 재현 할 수없는 문제로 인해 전체 문제가 발생했습니다. 두 번째 함수를 별도의 컨트롤러에있는 다른 함수에 콜백 매개 변수로 전달했는데 호출시 참조가 this
작동하지 않습니다.
예
anotherService.someCall('a', 123, myService.anotherPublicFunction);
해결할 수 anotherPublicFunction
없기 때문에 내부에서 실패합니다 this
.
문제를 보여주기 위해 Plunker를 작성했습니다 : http://plnkr.co/edit/rrRs9xnZTNInDVdapiqF?p=info
(다른 사람에게 도움이 될 수 있도록 여기에 질문을 남겨 둘 것입니다.)
서비스에 대한 참조 또는 이와 같은 첫 번째 기능을 사용하여 문제를 해결할 수 있다는 것을 알고 있습니다.
var ms = this;
this.anotherPublicFunction(param) {
ms.publicFunction(param);
...
};
아니면 이거
var pf = this.publicFunction;
this.anotherPublicFunction(param) {
pf(param);
...
};
그러나 둘 다 더러운 해킹처럼 보입니다.
이 경우 두 번째 함수에서 첫 번째 함수를 호출하는 좋은 방법이 있습니까? 아니면 이런 서비스를 받기 위해 처음에 완전히 잘못된 일을하고 있습니까?
다음 질문에 좋은 답변을 찾았습니다.
그러나 그들 중 하나는 호출 될 별도의 내부 기능이 있고 다른 하나는 서비스 대신 공장을 사용했기 때문에 내 문제와 다릅니다.
편집하다:
이것을 게시 한 후 나는 즉시 이것을 할 수 있다는 것을 깨달았습니다.
var actualWork = function(param) {
...
}
this.publicFunction(param) {
actualWork(param);
};
this.anotherPublicFunction(param) {
actualWork(param);
...
};
지금까지 다른 옵션만큼 나쁘지 않은 것 같습니다. 더 나은 접근 방식이 있습니까?
가장 좋은 방법은 다음과 같이하는 것입니다.
var myFunctions =
{
myFunc1: function(param) {
},
myFunc2: function(param) {
return foo + myFunctions.myFunc1(param)// do some stuff with the first function
}
}
return myFunctions;
이것을 사용하면 서비스를 사용하는 범위와 충돌 할 수 있다고 생각합니다 .
나는 내 자신의 각도 코딩 내 에서이 문제를 만났고이 형태의 솔루션을 사용하기로 결정했습니다.
angular.module('myService').service('myService', function() {
var myService = this;
myService.publicFunction(param) {
...
};
myService.anotherPublicFunction(param) {
myService.publicFunction(param);
...
};
});
내 코드에서 publicFunction을 사용하고 anotherPublicFunction 내부에서 프로세스의 일부로 publicFunction을 호출해야하는 여러 매개 변수를 반복하기 때문에이 방법을 선호했습니다.
좋은 것 같지만 this
더 이상 =
서비스 가 없을 때 무엇을합니까 ?
다음 예의 경우입니다.
return {
myFunc1: function(param) {
},
myFunc2: function(param) {
scope.$watchCollection(param,function(v) {
return foo + this.myFunc1(param)// do some stuff with the first function
}
}
}
function(v) {
당신 때문에 이제 기능 내의 다른 기능에 있으며 이것은 더 이상 서비스가 아니라 창입니다.
다음과 같이 서비스 내에서 객체를 반환 할 수 있습니다.
return {
myFunc1: function(param) {
},
myFunc2: function(param) {
return foo + this.myFunc1(param)// do some stuff with the first function
}
}
그래서 여러분 service.myFunc1
은 이것으로 내부 기능을 사용 하여 외부에서 접근 할 수 있습니다 .
'this'를 변수로 설정할 수 있습니다.
angular.module('myService').service('myService', function() {
var that = this;
this.publicFunction(param) {
...
};
this.anotherPublicFunction(param) {
that.publicFunction(param);
};
});
글쎄, 서비스에서 로컬 변수를 사용하여 서비스 함수에 대한 포인터 / 함수 변수를 두 개 더 만들고이를 사용하여 동일한 서비스 내에서 서비스 함수를 호출합니다.
*
angular.module('myService').service('myService', function() {
**var ref1, ref2;**
this.publicFunction = **ref1** = function(param) {
...
};
this.anotherPublicFunction = **ref2** = function(param) {
// how to call publicFunction(param)?
**ref1(argument);**
...
};
});
이것이 내가 구현 한 방법입니다.
.service('testSvc', function () {
return {
f1: function (v1) {
alert('f1 > v1=' + v1);
},
f2: function (v2) {
alert('f2 > v2=' + v2);
this.f1('az'); //use 'this'
}
}
})
아래 솔루션이 저에게 효과적이었습니다.
angular.module('myService').service('myService', function() {
var self= {
this.publicFunction(param) {
...
};
this.anotherPublicFunction(param) {
// You can call the publicfunction like below
self.publicFunction(param);
...
};
return self;
}
]);`
angular.module('myService').service('myService', function() {
return {
myFunc2: function(param) {
return foo + myFunc1(param);
}
};
function myFunc1(param){
...
};
});
전화하는 가장 쉽고 쉬운 방법은 다음과 같습니다.
myapp.service("SomeService", function ($http) {
this.func1 = function (params) {
// Some thing the service returns
return something;
}
this.func2 = function (params) {
// Some thing the service returns
var resp = this.func1(params);
return something;
}
}
서비스 대신 공장 선언을 사용하려면 다음을 수행 할 수 있습니다.
angular.module('myService').factory('myService', function() {
var myService = {};
myService.publicFunction = function(param) {
...
};
myService.anotherPublicFunction = function(param) {
// call publicFunction(param) like so
myService.publicFunction(param);
};
return myService;
});
'program story' 카테고리의 다른 글
SQLite 데이터베이스 파일 또는 덤프의 예를 어디서 찾을 수 있습니까? (0) | 2020.10.22 |
---|---|
android sdk 관리자의 인텔 x86 아톰 시스템 이미지는 무엇입니까? (0) | 2020.10.22 |
Requirejs를 언제 사용하고 번들 자바 스크립트를 언제 사용해야합니까? (0) | 2020.10.22 |
Task.Factory.StartNew ()는 호출 스레드가 아닌 다른 스레드를 사용하도록 보장됩니까? (0) | 2020.10.22 |
Windows에서 동시에 실행되는 여러 Java 버전 (0) | 2020.10.22 |