Mise à jour : J'ai mis une prime sur cette question. Je ne cherche pas de hacks ou de solutions de contournement. Je cherche un moyen officiel d'accéder au dom dans un composant angulaire, et une explication sur la raison pour laquelle le comportement que je vois ($postLink fonctionnant trop tôt) semble être en contradiction avec la documentation officielle.
La documentation officielle indique ( aquí ):
$postLink() - Appelé après que l'élément de ce contrôleur et ses enfants aient été liés. Similaire à la fonction post-link, ce hook peut être utilisé pour mettre en place des gestionnaires d'événements DOM et effectuer des manipulations directes du DOM.
Question originale : J'ai un exemple du problème ici -> http://plnkr.co/edit/rMm9FOwImFRziNG4o0sg?p=preview
J'utilise un composant angulaire et je veux modifier le dom dans la fonction post link, mais cela ne fonctionne pas, il semble que la fonction s'exécute trop tôt, avant que le modèle soit réellement prêt dans le dom après tout le traitement angulaire.
Dans la page html, j'ai ceci :
<my-grid grid-id="'foo'"></my-grid>
Le composant est défini comme suit :
appModule.component('myGrid',{
controller: gridController,
bindings: {
"gridId": "<",
},
templateUrl: 'gridTemplate'
});
Dans le modèle de composant, j'ai ceci :
<table id='{{$ctrl.gridId}}'>
...
(La reliure elle-même fonctionne, il n'y a aucun doute. Finalement, dans le html l'id de la table est 'foo' comme prévu).
Dans le contrôleur, j'ai quelque chose comme ceci :
function gridController($scope, $compile, $attrs) {
console.log ("grid id is: " + this.gridId); // 'foo'
this.$postLink = function() {
var elem = document.getElementById(this.gridId);
// do something with elem, but elem is null
}
}
Ce que je constate en déboguant, c'est que lorsque la fonction $postLink est exécutée, la table est dans le dom mais son attribut id est toujours {{$ctrl.gridId}}
au lieu de foo
donc document.getElementById()
ne trouve rien. Cela semble en contradiction avec la documentation.
Qu'est-ce que je rate ? Existe-t-il un autre moyen d'accéder au domaine dans le composant ?
Mise à jour 2 : Aujourd'hui, j'ai réalisé que le même problème se produit avec la fonction de lien ordinaire des directives, il n'est pas limité aux composants. Apparemment, j'ai mal compris le sens de l'expression "faire une manipulation directe du DOM" - la fonction de lien s'exécute sur un élément qui est détaché du DOM, donc l'utilisation de la commande document
avec des sélecteurs est inutile.