Registrei meu ouvinte em um evento $ broadcast usando $ on function
$scope.$on("onViewUpdated", this.callMe);
e quero cancelar o registro desse ouvinte com base em uma regra de negócios específica. Mas meu problema é que, uma vez registrado, não consigo cancelar o registro.
Existe algum método no AngularJS para cancelar o registro de um ouvinte específico? Um método como $ para cancelar o registro deste evento pode ser $ off. Então, com base na lógica de negócios, posso dizer
$scope.$off("onViewUpdated", this.callMe);
e essa função deixa de ser chamada quando alguém transmite o evento "onViewUpdated".
obrigado
EDIT : Quero cancelar o registro do ouvinte de outra função. Não é a função onde eu o registro.
Respostas:
Você precisa armazenar a função retornada e chamá-la para cancelar a inscrição no evento.
Isso é encontrado no código-fonte :) pelo menos na versão 1.0.4. Vou apenas postar o código completo, já que é curto
Além disso, consulte os documentos .
fonte
Olhando para a maioria das respostas, elas parecem excessivamente complicadas. Angular construiu mecanismos para cancelar o registro.
Use a função de cancelamento de registro retornada por
$on
:fonte
$scope.$on
não precisa ser cancelado o registro manualmente$destroy
. Um exemplo melhor seria usar a$rootScope.$on
.Este código funciona para mim:
fonte
EDIT: A maneira correta de fazer isso é na resposta do @ LiviuT!
Você sempre pode estender o escopo do Angular para permitir a remoção de ouvintes da seguinte maneira:
E aqui está como isso funcionaria:
E aqui está um exemplo disso em ação
fonte
Após depurar o código, criei minha própria função, como a resposta do "blesh". Então foi isso que eu fiz
então, anexando minha função ao $ rootscope, agora ela está disponível para todos os meus controladores.
e no meu código eu estou fazendo
obrigado
EDIT: A maneira AngularJS de fazer isso é na resposta do @ LiviuT! Mas se você deseja cancelar o registro do ouvinte em outro escopo e, ao mesmo tempo, deseja evitar a criação de variáveis locais para manter as referências da função de cancelamento de registro. Esta é uma solução possível.
fonte
A resposta do @ LiviuT é incrível, mas parece deixar muita gente se perguntando como acessar novamente a função de desmontagem do manipulador de outro escopo ou função $, se você quiser destruí-lo de um local diferente daquele onde foi criado. A resposta de @ Рустем Мусабеков funciona muito bem, mas não é muito idiomática. (E se baseia no que é suposto ser um detalhe de implementação privada, que pode mudar a qualquer momento.) E a partir daí, fica mais complicado ...
Eu acho que a resposta fácil aqui é simplesmente levar uma referência à função de desmontagem (
offCallMeFn
no exemplo dele) no próprio manipulador e chamá-la com base em alguma condição; talvez um argumento que você inclua no evento que você $ transmite ou $ emite. Assim, os manipuladores podem se derrubar, sempre que quiserem, onde quiserem, carregando as sementes de sua própria destruição. Igual a:Dois pensamentos:
selfDestruct
assim que concluir sua missão suicida.fonte
Registre um gancho para cancelar a inscrição de seus ouvintes quando o componente for removido:
fonte
Caso você precise ativar e desativar o ouvinte várias vezes, é possível criar uma função com o
boolean
parâmetrofonte
'$ on' em si retorna a função para cancelar o registro
você pode chamar a função unregister () para cancelar o registro desse ouvinte
fonte
Uma maneira é simplesmente destruir o ouvinte assim que terminar.
fonte