Come è possibile eseguire un metodo $scope.myWork()
dopo il modello di rendering? Voglio impostare il $scope.value
e dopo ho bisogno di cambiare qualcosa con JQuery (ad esempio nel DOM del contenuto del modello). $scope.$watch('value', function(){....})
funziona con il rendering "prima" (il DOM del modello non è ancora disponibile). Grazie.AngularJS: callback dopo il rendering (funziona con DOM dopo il rendering)
risposta
Io uso terminal
e transclude
in una direttiva attributo per chiamare un metodo ambito dopo un modello viene aggiornato e la vista è resa (nel mio caso per ridimensionare un iframe dopo un $ Resource.query):
.directive('postRender', [ '$timeout', function($timeout) {
var def = {
restrict : 'A',
terminal : true,
transclude : true,
link : function(scope, element, attrs) {
$timeout(scope.resize, 0); //Calling a scoped method
}
};
return def;
}])
Il timeout $ è magia nera. È dovrebbe essere possibile dichiarare il metodo JS come valore di attributo e $ analizzarlo.
per cui uso in un ng-repeat
(nel mio caso un albero è reso in modo ricorsivo):
<div post-render ng-repeat="r in regions | orderBy:'name'" ng-include="'tree_region_renderer.html'">
Jens risposta di cui sopra funziona, ma si noti che sulle versioni più recenti AngularJS (ad esempio 1.2.3) si non può avere la direttiva postRender in combinazione con ng-repeat come attributi sullo stesso tag poiché entrambi hanno una transclude: true. In tal caso, è necessario rimuovere transclude o disporre di un tag separato con l'attributo direttiva postRender.
Inoltre, si tenga presente la priorità degli attributi quando si utilizza il terminale: true poiché si potrebbe finire per avere un attributo non efficace a causa di uno più priorotizzato sullo stesso tag.
Ho anche avuto questo problema, altre soluzioni non hanno funzionato bene per me, e mi è sembrato il tipo di cosa che il goniometro deve aver risolto. Una rapida revisione di Protractor's client-side scripts mostra che utilizza angular.getTestability(element)
per sapere quando effettivamente eseguire i test. Il metodo attende finché non ci sono timeout in sospeso o richieste HTTP e quindi esegue la richiamata. Ecco la mia direttiva:
export function afterRender ($timeout) {
"ngInject";
return {
restrict: 'A',
terminal: true,
link: function (scope, element, attrs) {
angular.getTestability(element).whenStable(function() {
console.log('[rendered]');
});
}
};
}
Poiché si sta eseguendo all'interno dell'app Angular, si può semplicemente iniettare '$ browser' e registrare un callback con il suo metodo' notifyWhenNoOutstandingRequests() '. Si noti, tuttavia, che ciò si basa su alcune API private non documentate e potrebbe interrompersi senza preavviso. – gkalpak
Ho trovato questa pagina quando cercavo un modo per profilare il rendering DOM. Ho trovato una soluzione molto semplice che funziona per il mio caso d'uso.
Collegare un gestore di ng-init all'elemento DOM e nella funzione di gestore, utilizzare $ timeout per ottenere l'esecuzione. Esempio:
HTML:
<div ng-init="foo()">
JS:
$scope.foo = function() {
$timeout(function() {
// This code runs after the DOM renders
});
});
- 1. Come chiamare la funzione dopo il rendering dom in Angular2
- 2. Modifica origine evento Fullcalendar dopo il rendering
- 3. THREE.js: chiamata lookAt metodo dopo il rendering non funziona
- 4. KnockoutJS bind evento dopo il rendering modello
- 5. $$ postDigest e DOM rendering
- 6. knockoutJS eseguire richiamata dopo foreach termina il rendering
- 7. Dopo il rendering dell'evento su CompositeView con Backbone.Marionette
- 8. Rendering parziale dopo caricamento pagina
- 9. Come eseguire alcune attività dopo il rendering in Rails 3.1
- 10. callback successo dopo knockout.js termina il rendering di tutti gli elementi
- 11. eventi backbone.js non attivati dopo il re-rendering
- 12. Pannello Griglia Extjs - Modifica proprietà enableColumnHide dopo il rendering
- 13. I CSS diventano effettivi dopo il rendering della pagina
- 14. Fai una condizione rendering con AngularJS
- 15. Scheda Angularjs Caricamento spinner durante il rendering
- 16. Filtro da eseguire prima del rendering ma dopo il controller?
- 17. Angular 2 esegue lo script dopo il rendering del modello
- 18. debug Backbone.js: il rendering dopo la raccolta fetch()
- 19. React Native AsyncStorage recupera i dati dopo il rendering
- 20. AngularJS - lato server di rendering
- 21. Rendering del testo iOS dopo lo zoom
- 22. three.js dom id dell'elemento canvas utilizzato per il rendering Webgl
- 23. Richiamare la funzione di callback dopo zingChart.render()
- 24. Manipolazione DOM durante il rendering SVG di grandi dimensioni
- 25. IE11 slow/freeze con il rendering ripetizione ng di AngularJS
- 26. Attivatore Jquery Datepicker dopo aver modificato il mese (dopo i rendering del mese)
- 27. .click() non riesce dopo il cambio dom
- 28. Come eseguire il rendering di rendering parziale con RSpec
- 29. Creare una direttiva AngularJS che non esegue il rendering immediato?
- 30. angularjs inserisce il modulo dopo l'inizializzazione dell'app
C'è il mio esempio, che non funziona - http://jsfiddle.net/C6SUv/7/ (perché isn' t $ scope.afterRender call dopo ogni rendering?). – user1595465
perché la funzione di collegamento viene chiamata una volta dopo il rendering dell'elemento, non dopo ogni rendering di angolare. Perché non è possibile creare direttive apportare le modifiche necessarie con jQuery e aggiornare angolare? Manipolare DOM all'interno dei controller non è una buona pratica –
Hmmmmm. Devo scorrere div con altezza fissa. Ho i pulsanti per spostare il cursore nell'elenco dei campi. Ho impostato $ scope.value in ngClick e dopo di che ho bisogno di scorrere sulla posizione giusta (tramite scrollTop). Questa è la ragione, perché voglio manipolare DOM all'interno del controller. Qualche idea? – user1595465