2013-08-13 2 views
4

각도 컨트롤러 내에서 websocket 서비스에 연결 중입니다. 컨트롤러 범위가 파괴되면 분명히 구독을 제거하고 싶습니다.

범위를 파괴 할 때 자동 제거가 가능하도록 현재 범위를 내 서비스 가입 기능에 전달하는 것이 안전합니까? 만약 내가 그다음 소켓 청취자와 연결하는 각각의 컨트롤러는 정리를 기억해야한다.

기본적으로 현재 $ scope를 서비스 기능에 전달하는 것이 안전할까요? 아니면이를 수행하는 더 좋은 방법이 있습니까?

답변

4

나는 내 프로젝트에서 비슷한 요구를했다. 다음은 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); 
    } 
}; 
+1

고마워, 내가 뭘 어쨌다. – redsquare

2

범위를 통과하지 못했습니다. 대신 명시 적으로 귀하의 컨트롤러에서 탈퇴를 연결합니다. http://odetocode.com/blogs/scott/archive/2013/07/16/angularjs-listening-for-destroy.aspx에서

:

$scope.$on("$destroy", function() { 
    if (timer) { 
     $timeout.cancel(timer); 
    } 
}); 

나는이 명시 적으로 수행 갖는 논리를 따라하기 등의 마법, 쉽게되지라고 생각합니다. 나는 그것이 또한 구독을 취소해야한다면 서비스가 너무 많이 할 것이라고 생각한다. 컨트롤러가 일찍 구독을 취소하려면 어떻게해야합니까?

그러나 어디에서나 사용되는 매우 구체적인 사용 사례가있는 경우 범위를 전달하는 것이 좋습니다. 서비스가 범위를 필요로하는 시간은 기본적으로 컨트롤러가 처음 실행할 때 매우 작습니다. 서비스는 $ destroy 이벤트를 수신 할 수 있습니다.

+0

나는 위와 같은 것을 할 수 있음을 알고 있습니다. 나는 그것을 조금 건조하게 유지하고 더 나은 방법을 만들려고 노력했다. 이 컨트롤러가 50 대 이상 필요하면 어떻게해야합니까? 많은 반복 된 코드, 잊을 기회 등? 당신의 의견 뒤에있는 이유는 무엇입니까? – redsquare

+0

@redsquare 그것은 좋은 지적입니다. 내 대답을 업데이트했습니다 –