He registrado a mi oyente en un evento $ broadcast usando la función $ on
$scope.$on("onViewUpdated", this.callMe);
y quiero anular el registro de este oyente basado en una regla comercial particular. Pero mi problema es que una vez que está registrado no puedo anular el registro.
¿Hay algún método en AngularJS para anular el registro de un oyente en particular? Un método como $ en que anula el registro de este evento, puede ser $ off. Entonces, en base a la lógica de negocios, puedo decir
$scope.$off("onViewUpdated", this.callMe);
y esta función deja de llamarse cuando alguien difunde el evento "onViewUpdated".
Gracias
EDITAR : Quiero cancelar el registro del oyente de otra función. No es la función donde lo registro.
Respuestas:
Debe almacenar la función devuelta y llamarla para darse de baja del evento.
Esto se encuentra en el código fuente :) al menos en 1.0.4. Voy a publicar el código completo ya que es corto
Además, vea los documentos .
fuente
Mirando la mayoría de las respuestas, parecen demasiado complicadas. Angular ha incorporado mecanismos para cancelar el registro.
Utilice la función de desregistro devuelta por
$on
:fuente
$scope.$on
no es necesario que no se registre manualmente$destroy
. Un mejor ejemplo sería usar a$rootScope.$on
.Este código me funciona:
fuente
EDITAR: ¡La forma correcta de hacer esto está en la respuesta de @ LiviuT!
Siempre puede ampliar el alcance de Angular para permitirle eliminar dichos oyentes de esta manera:
Y así es como funcionaría:
Y aquí hay un golpeador en acción
fuente
Después de depurar el código, creé mi propia función al igual que la respuesta de "blesh". Entonces esto es lo que hice
entonces al adjuntar mi función a $ rootscope ahora está disponible para todos mis controladores.
y en mi código estoy haciendo
Gracias
EDITAR: ¡La forma de AngularJS de hacer esto está en la respuesta de @ LiviuT! Pero si desea anular el registro del oyente en otro ámbito y, al mismo tiempo, desea mantenerse alejado de la creación de variables locales para mantener referencias de la función de anulación del registro. Esta es una posible solución.
fuente
La respuesta de @ LiviuT es increíble, pero parece dejar a muchas personas preguntándose cómo volver a acceder a la función de desmantelamiento del controlador desde otro $ alcance o función, si desea destruirla desde un lugar distinto de donde se creó. La respuesta de @ Рустем Мусабеков funciona muy bien, pero no es muy idiomática. (Y se basa en lo que se supone que es un detalle de implementación privado, que podría cambiar en cualquier momento). Y a partir de ahí, se vuelve más complicado ...
Creo que la respuesta fácil aquí es simplemente llevar una referencia a la función de desmontaje (
offCallMeFn
en su ejemplo) en el controlador mismo, y luego llamarla en función de alguna condición; quizás un argumento que incluyas en el evento que $ transmites o $ emites. De este modo, los manipuladores pueden derribarse, cuando quieran, donde quieran, llevando consigo las semillas de su propia destrucción. Al igual que:Dos pensamientos:
selfDestruct
tan pronto como haya completado su misión suicida.fuente
Registre un enlace para cancelar la suscripción de sus oyentes cuando se elimine el componente:
fuente
En caso de que necesite encender y apagar el oyente varias veces, puede crear una función con
boolean
parámetrofuente
'$ on' en sí mismo devuelve la función para cancelar el registro
puede llamar a la función unregister () para cancelar el registro de ese oyente
fuente
Una forma es simplemente destruir al oyente una vez que haya terminado con él.
fuente