2013-01-31 6 views
12

C'è un modo per rimuovere un ambito dai cicli di digest? In altre parole, sospendere/riprendere un ciclo di digest di scope?Rimuovere e ripristinare l'ambito dai cicli di digest

Nel mio caso, ho tutte le pagine già caricate, ma non tutte sono visibili. Quindi mi piacerebbe sospendere quelli che non sono visibili per evitare l'elaborazione inutile. Non voglio usare ng-view + $route, non voglio/ho bisogno di deep-linking.

Ho visto this thread e sono arrivato a this fiddle. Probabilmente fa il lavoro, ma è piuttosto invasivo e non molto adatto all'aggiornamento delle strutture.

C'è qualche altra soluzione come un $scope.suspend() e scope.resume()? O uno meno invasivo (dal punto di vista del framework)? Attualmente sto pensando ai cicli $destroy e $compile.

risposta

3

Poiché il framework è valido oggi non esistono metodi per sospendere/riprendere il digest su un ambito. Detto questo ci sono diverse tecniche che si possono usare per limitare il numero di orologi che vengono eseguiti come parte di un ciclo di digestione.

Prima di tutto, se le parti di uno schermo sono nascoste in ogni caso, è possibile utilizzare la famiglia di direttive ng-switch rimuovendo completamente le parti invisibili dal DOM.

In secondo luogo, se un ciclo di digest viene attivato dalla direttiva tramite $apply e si desidera limitare gli orologi rivalutazione a figlio Scopes si potrebbe chiamare $digest invece di $apply.

Quindi, si, è possibile distruggere e ricreare gli ambiti come descritto nella discussione a cui si è collegati. Ma se stai già nascondendo parti del DOM, sembra che ng-switch potrebbe essere una soluzione migliore.

+0

L'utilizzo di 'ng-switch' è un'opzione considerevole per questo caso d'uso. Ma non credi sia ragionevole che qualcuno che usa un codice non angolare vorrebbe sospendere gli aggiornamenti su una certa parte del DOM senza lasciare che 'ng-switch' controlli la manipolazione? Potremmo sicuramente imitare il comportamento di 'ng-switch', ma sembra che questa sia una caratteristica chiave per l'ottimizzazione delle prestazioni su grandi progetti ibridi. Inoltre, forse un modo per impedire agli orologi 'ng-bind' di funzionare solo. Non so ... condividi i tuoi pensieri per favore. –

12

Ho incontrato lo stesso problema e ho trovato una soluzione interessante che non interferisce (troppo) con AngularJS. Aggiungere questo agli scopi che si desidera disattivare:

var watchers; 

scope.$on('suspend', function() { 
    watchers = scope.$$watchers; 
    scope.$$watchers = []; 
}); 

scope.$on('resume', function() { 
    scope.$$watchers = watchers; 
    watchers = null; 
}); 

Quindi, è possibile disattivare un campo di applicazione e suoi figli con: scope.$broadcast('suspend') e riportarlo con scope.$broadcast('resume').

+0

Bel trucco. Questo sicuramente farebbe il trucco, anche se non mi piacciono gli hack abbastanza bene poiché rende più difficile l'aggiornamento delle versioni. Ad ogni modo, se qualcuno usasse questo approccio, sarebbe bello anche sovrascrivere '$ scope. $ Watch', poiché i nuovi osservatori potrebbero essere aggiunti mentre disabilitati. –

+0

Ho appena pubblicato un breve articolo su questa tecnica: https://coderwall.com/p/d_aisq –

+0

questo mi ha appena salvato con un'app che aveva una tabella non performante che non è sempre visibile. la soluzione lunga è quella di impaginare la tabella ordinabile e fare lo scroll infinito ... ma questo dà un calcio che può andare giù per strada in modo che possiamo concentrarci su caratteristiche più importanti dovute al momento. simpatico. corteggiare il debito tecnologico! – FlavorScape

Problemi correlati