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'
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top