validate validar valid form error angularjs angularjs-scope sockjs

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); } };