Transmitir mudança de rootscope
-
21-12-2019 - |
Pergunta
Estou tentando escrever um script para acessar o rootscope e alterar o valor de uma variável nas ferramentas de desenvolvimento.Posso obter o escopo e o rootscope, mas minhas alterações não aparecem nas minhas ligações.No entanto, se eu usar uma entrada vinculada, tudo ficará bem.
Exemplo:
<input ng-model="mode"></input>
<span ng-bind-html="mode"></span>
atualizem-se bem, mas
angular.element("body").scope().$root.mode = 'test'
Atualiza o controlador, mas não afeta as ligações.Comparei meu controlador original e meu controlador de console usando === e eles são iguais.
Então, pelo que li, preciso transmitir ou emitir que mudei o escopo, porém não consigo descobrir o que transmitir ou se estou transmitindo corretamente.
Tentativas de código de transmissão:
scope.$apply(function() {root.$emit('change', {mode: 1})})
scope.$apply(function() {root.$emit('stateChangeSuccess', {mode: 1})})
root.$apply(function() {root.$emit('change', {mode: 1})})
root.$apply(function() {root.$emit('stateChangeSuccess', {mode: 1})})
Além disso, deve-se observar que alterar a entrada alterará o intervalo, mas não minha cópia do escopo raiz.
root.mode = 'console'
type 'input text' in the input
root.mode returns 'console'
Solução
Não creio que isso seja possível com eventos (talvez eu esteja errado).Existe outra maneira de fazer alterações no console.
A razão angular.element("body").scope().$root.mode = 'test'
não atualiza suas ligações é que o Angular não "sabe" que uma alteração no escopo foi feita.Se você estiver fazendo atualizações em seu modelo de dados "de fora" do mundo Angular, precisará agrupar suas alterações em um $apply()
função:
var $rootScope = angular.element("body").scope().$root;
$rootScope.$apply(function() {
$rootScope.mode = 'hi';
});
Para sua informação, ao enviar um evento do $rooteScope
, você vai querer usar $broadcast
em vez de $emit
. $broadcast
transmite um evento "para baixo" para todos os escopos descendentes, enquanto $emit
envia o evento "para cima" para escopos ancestrais.Se você $emit
de $rootScope
, não há escopos ancestrais para capturar o evento (embora talvez o $rootScope
vai?).
Outras dicas
Se bem entendi, scope() === $root, caso contrário, você está fazendo algumas suposições falsas aqui.
O que acredito que está acontecendo é que você está alterando o valor do escopo raiz, mas suas ligações estão, na verdade, usando outro escopo devido à herança do protótipo (por exemplo, a propriedade string é realmente criada em scope() quando você se vincula a ela).
Experimente um destes dois truques:
1) Ou tente scope.$apply(function(){scope.mode ='test'});
2) $root.mode={name:'test'};
e vincule-se a mode.name em html
Observe que você deve ser capaz de disparar um ciclo $digest usando $apply no escopo raiz e ele também deve ser propagado para escopos filhos. $root.$apply();