Domanda

Sto cercando di scrivere uno script per accedere alla rootscope e modificare un valore di variabili dagli strumenti di Dev.Posso ottenere l'ambito e la roothope, ma i miei cambiamenti non si presentano nei miei attacchi.Tuttavia, se uso un ingresso rilegato, tutto va bene.

Esempio:

<input ng-model="mode"></input>
<span ng-bind-html="mode"></span>
.

Aggiorna l'un l'altro Bene ma

angular.element("body").scope().$root.mode = 'test'
.

Aggiorna il controller ma non ha alcun effetto sui Binding.Ho confrontato il mio controller originale e il mio controller della console usando=== e sono uguali.

Quindi da quello che ho letto devo trasmettere o emettere che ho cambiato lo scopo, tuttavia non riesco a capire cosa trasmettere o se sto trasmettendo correttamente.

Tentativi di codice di trasmissione:

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

Inoltre, si deve notare che la modifica dell'input cambierà la span ma non la mia copia della portata di radice.

root.mode = 'console'
type 'input text' in the input
root.mode returns 'console'
.

È stato utile?

Soluzione

Non penso che sia possibile con eventi (forse ho torto). C'è un altro modo per apportare modifiche dalla console però.

La ragione per cui angular.element("body").scope().$root.mode = 'test' non aggiorna i tuoi Bindings è che l'angolare non "sanno" è stato effettuato una modifica allo scopo. Se stai effettuando aggiornamenti sul modello di dati da "al di fuori del mondo angolare, dovrai avvolgere le modifiche in una funzione $apply():

var $rootScope = angular.element("body").scope().$root;
$rootScope.$apply(function() {
  $rootScope.mode = 'hi';
});
.

FYI, quando si invia un evento dal $rooteScope, ti consigliamo di utilizzare $broadcast invece di $emit . $broadcast trasmette un evento "verso il basso" a tutti gli ambiti discendenti, mentre $emit invia l'evento "verso l'alto" agli scopi antenati. Se $emit Dal $rootScope, non ci sono scopi antenati per raccogliere l'evento (anche se forse il $rootScope lo farà?).

Altri suggerimenti

Se ti capisco correttamente, scopa ()=== $ radice, altrimenti stai facendo delle false ipotesi qui.

Quello che credo sta accadendo è che stai cambiando il valore della portata del root ma i tuoi attacchi stanno effettivamente utilizzando un altro scopo a causa dell'ereditarietà del prototipo (ad esempio la proprietà della stringa è effettivamente creata in ambito () quando si legami contro di esso).

Prova uno di questi due trucchi:

1) PROVA scope.$apply(function(){scope.mode ='test'});

2) $root.mode={name:'test'}; e Binding contro la modalità. Nome in HTML

Avviso che dovresti essere in grado di sparare un ciclo di $ diger utilizzando $ applicare sullo scopo di radice e dovrebbe propagare anche agli ambiti infantili.$root.$apply();

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top