Broadcast Rootscope Change.
-
21-12-2019 - |
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'
. 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();