2

Je rencontre des problèmes avec AngularJS et $ timeout.
Je dois exécuter du code, une fois la page chargée. Http.get() charge les éléments et ng-repeat les affiche dans la table. Ensuite, je dois exécuter le code pour mettre en évidence la ligne lorsque je clique dessus.

J'ai trouvé une solution pour cela en utilisant $ timeout.

$timeout(function() { 
    console.log('in timeout'); 
    $scope.highlightRows(); 
}); 

cela ne fonctionne pas, mais pas à chaque fois. Dans la fonction je consigner le nombre de lignes dans la table et parfois je reçois 0, donc le gestionnaire de clic n'est pas enregistré et la surbrillance ne marche pas.

$scope.highlightRows = function() { 
    console.log($("#tripsTable").children("tbody").children("tr").length); 
    $("#tripsTable").children("tbody").children("tr").children().click(function() { 
     console.log('row click'); 
     $("#tripsTable").children("tbody").children("tr").removeClass("focusedRow"); 
     $(this.parentNode).addClass("focusedRow"); 
    }); 
}; 

Lorsque vous essayez de simuler je dois actualiser par Ctrl + F5.

journal de la console:

in timeout tripsController.js:14 
0 

je ne pouvais pas trouver des solutions à ce problème, des suggestions sera apprécié :) Merci

Mark

EDIT: ceci est mon HTML

<table class="table table-bordered" id="tripsTable">@*table-hover*@ 
    <thead> 
     .... 
    </thead> 
    <tbody> 
     <tr ng-repeat="trip in tripsVM.tripsList | orderBy: 'startDate'" ng-class="(trip.tripID == 0) ? 'newRow' : ''" class="row"> 
      .... 
+0

Je pense que le problème ici sera que vous pouvez garantir que la manipulation DOM angulaire est fait avec la directive 'ngRepeat' arrive avant ou après le délai d'expiration. Parfois, cela arrivera avant (dans ce cas, vous le voyez fonctionner) et parfois cela arrivera après (dans ce cas, vous verrez que cela ne fonctionne pas). Pour adopter une approche angulaire pour faire ce que vous cherchez ici, la manipulation DOM montrée dans la fonction '$ scope.highlightRows' serait mieux faite dans une directive. La directive peut câbler le gestionnaire 'click' au moment où les éléments DOM de la table sont créés. – chrisg

+0

Appelez-vous $ timeout depuis la fonction de lien de votre directive? Si c'est à l'intérieur du contrôleur, il ne garantit pas qu'il s'exécute après la phase de rendu. – pixelbits

+1

On dirait que la ligne en surbrillance est appelée avant le rendu de la table. Pourriez-vous s'il vous plaît poster le code http $ pour mieux comprendre cela. –

Répondre

8

Cela ressemble à un problème de synchronisation. Comme vous ne fournissez pas de paramètre de durée à la fonction $ timeout, il s'exécute immédiatement. Cela pourrait être en cours d'exécution avant que ng-repeat ait fini de rendre les données, donc rien ne semble se produire. En tant que test, vous pouvez essayer d'ajouter un délai important à la fonction $ timeout pour voir si cela fait une différence. Si c'est le cas, vous devrez alors penser à un moyen de déclencher une fois que vous savez que les éléments ont été affichés.

$timeout(function() { 
    console.log('in timeout'); 
    $scope.highlightRows(); 
}, 2000); 

Aussi je serais fortement conseils que vous ne faites pas JQuery dans votre contrôleur - en fait, je vous conseille fortement de ne pas utiliser JQuery du tout!

Vous pouvez effectuer toute cette logique en utilisant simplement des directives angulaires telles que ng-click & ng-class.

<table><tbody><tr ng-repeat="item in items" ng-click="selectItem(item)" ng-class={'focusedRow': item === selectedItem}"><td>{{item.Name}}</td></tr></tbody></table> 

Ensuite, dans votre contrôleur ont la méthode selectItem

$scope.selectItem = function (item) { 
    $scope.selectedItem = item; 
} 
+1

La fonction jQuery désélectionne d'autres lignes quand on est sélectionné, donc peut-être un léger changement ... 'ng-click =" selectedItem = élément "ng-class = {'focusedRow': item === selectedItem}" ' –

+0

Merci, cela fonctionne très bien :) – Mara

+0

Ouais, pour cela je passe par toute la collection et la désélectionne en cliquant puis sélectionne celui sur lequel j'ai cliqué, celui-ci a l'air beaucoup plus propre! EDIT: mais maintenant il ne se désélectionne pas quand on clique sur l'autre rangée – Mara

Questions connexes