angularjs - validar - valid angular
Seguro pasar el $ scope actual del controlador a la funciĆ³n de servicio angularjs (2)
Dentro de un controlador angular me estoy conectando a un servicio websocket. Cuando se destruye el alcance de los controladores, obviamente quiero eliminar la suscripción.
¿Es seguro pasar el alcance actual a la función de suscripción de mi servicio para que pueda eliminarse automáticamente en scope destroy? Si no lo hago, entonces cada controlador que se conecta a un receptor de socket debe recordar también limpiar.
Básicamente, ¿es seguro pasar el $ scope actual a una función de servicio o hay una mejor manera de hacerlo?
No aprobaría el alcance. En cambio, explícitamente, en su controlador, conectar la cancelación de suscripción.
Desde http://odetocode.com/blogs/scott/archive/2013/07/16/angularjs-listening-for-destroy.aspx :
$scope.$on("$destroy", function() {
if (timer) {
$timeout.cancel(timer);
}
});
Creo que tener esto hecho explícitamente no es tan mágico, y es más fácil seguir la lógica. Creo que el servicio estaría haciendo demasiado si fuera también darse de baja. ¿Qué sucede si un controlador quiere darse de baja antes de tiempo?
Sin embargo, si tiene un caso de uso muy específico que se usa en todas partes, estaría bien pasar el alcance. La cantidad de tiempo que el servicio necesita el alcance es muy pequeño, básicamente cuando el controlador se ejecuta por primera vez para que el servicio pueda escuchar al evento $ destroy.
Tenía una necesidad similar en mi proyecto. A continuación se muestra el objeto devuelto en una fábrica de AngularJS (que inicializa WebSocket). El método onmessage
automáticamente una callback
si pasa en su scope
asociado en el segundo argumento.
io =
onmessage: (callback, scope) ->
listeners.push callback
if scope then scope.$on "$destroy", => @offmessage callback
offmessage: (callback) -> listeners.remove callback
La equivalencia de JavaScript está debajo.
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);
}
};