각도 컨트롤러 내에서 websocket 서비스에 연결 중입니다. 컨트롤러 범위가 파괴되면 분명히 구독을 제거하고 싶습니다.
범위를 파괴 할 때 자동 제거가 가능하도록 현재 범위를 내 서비스 가입 기능에 전달하는 것이 안전합니까? 만약 내가 그다음 소켓 청취자와 연결하는 각각의 컨트롤러는 정리를 기억해야한다.
기본적으로 현재 $ scope를 서비스 기능에 전달하는 것이 안전할까요? 아니면이를 수행하는 더 좋은 방법이 있습니까?
각도 컨트롤러 내에서 websocket 서비스에 연결 중입니다. 컨트롤러 범위가 파괴되면 분명히 구독을 제거하고 싶습니다.
범위를 파괴 할 때 자동 제거가 가능하도록 현재 범위를 내 서비스 가입 기능에 전달하는 것이 안전합니까? 만약 내가 그다음 소켓 청취자와 연결하는 각각의 컨트롤러는 정리를 기억해야한다.
기본적으로 현재 $ scope를 서비스 기능에 전달하는 것이 안전할까요? 아니면이를 수행하는 더 좋은 방법이 있습니까?
나는 내 프로젝트에서 비슷한 요구를했다. 다음은 AngularJS 팩토리에서 반환 된 객체입니다 (WebSocket을 초기화 함). onmessage
메서드는 두 번째 인수에 연결된 scope
을 전달하면 callback
을 자동으로 수신 거부합니다.
io =
onmessage: (callback, scope) ->
listeners.push callback
if scope then scope.$on "$destroy", => @offmessage callback
offmessage: (callback) -> listeners.remove callback
아래와 같은 JavaScript 동일어가 있습니다.
var io = {
onmessage: function(callback, scope) {
var _this = this;
listeners.push(callback);
if (scope) {
scope.$on("$destroy", function() {
_this.offmessage(callback);
});
}
},
offmessage: function(callback) {
listeners.remove(callback);
}
};
범위를 통과하지 못했습니다. 대신 명시 적으로 귀하의 컨트롤러에서 탈퇴를 연결합니다. http://odetocode.com/blogs/scott/archive/2013/07/16/angularjs-listening-for-destroy.aspx에서
:
$scope.$on("$destroy", function() {
if (timer) {
$timeout.cancel(timer);
}
});
나는이 명시 적으로 수행 갖는 논리를 따라하기 등의 마법, 쉽게되지라고 생각합니다. 나는 그것이 또한 구독을 취소해야한다면 서비스가 너무 많이 할 것이라고 생각한다. 컨트롤러가 일찍 구독을 취소하려면 어떻게해야합니까?
그러나 어디에서나 사용되는 매우 구체적인 사용 사례가있는 경우 범위를 전달하는 것이 좋습니다. 서비스가 범위를 필요로하는 시간은 기본적으로 컨트롤러가 처음 실행할 때 매우 작습니다. 서비스는 $ destroy 이벤트를 수신 할 수 있습니다.
나는 위와 같은 것을 할 수 있음을 알고 있습니다. 나는 그것을 조금 건조하게 유지하고 더 나은 방법을 만들려고 노력했다. 이 컨트롤러가 50 대 이상 필요하면 어떻게해야합니까? 많은 반복 된 코드, 잊을 기회 등? 당신의 의견 뒤에있는 이유는 무엇입니까? – redsquare
@redsquare 그것은 좋은 지적입니다. 내 대답을 업데이트했습니다 –
고마워, 내가 뭘 어쨌다. – redsquare