Ho una semplice direttiva in cui il modello utilizza ng-repeat al suo interno. Ho bisogno di eseguire del codice per istanziare un componente jquery contro alcuni degli elementi creati dalla direttiva ng-repeat. Il problema è che se inserisco questo codice nella funzione di collegamento. La ng-repeat non ha ancora costruito quegli elementi in modo tale che nulla venga istanziato.AngularJS: collegamento a elementi in una direttiva che utilizza ng-repeat
App.directive('myDirective', ['$compile', '$timeout', function($compile, $timeout) {
return {
scope: {
domains: '='
},
templateUrl: '/app/partials/my_directive.html',
link: function($scope, element, attributes) {
element.find('.standard-help').tooltip('destroy');
element.find('.standard-help').tooltip({placement: 'top', trigger: 'click hover focus'});
}
};
}
Il modello sarà simile al seguente. Sto cercando di collegare
<ul class="media-list domainList">
<li class="media" style="position:relative;" ng-repeat="domain in domains">
<a class="domainHeader" href="javascript://">
<span class="domainHeader">{{domain.tag}}</span>
</a>
<div class="media-body" style="margin-left: 52px;">
<ul class="standardsList">
<li ng-class="{ standardDisplayed: lessonLayout == 'standards' }" ng-hide="standard.lessons.length == 0" ng-repeat="standard in domain.standards">
<a href="javascript://" title="{{standard.description}}" ng-show="lessonLayout == 'standards'" class="standard-help pull-right"><i class="icon-question-sign"></i></a>
<h6 ng-show="lessonLayout == 'standards'">{{standard.tag}}</h6>
<ul class="lessonsList">
<li ng-class="{ lesson: true }" ng-repeat="lesson in standard.lessons" ng-click="onLessonSelected(lesson)">
<i class="icon-lock lesson-locked"></i>
<div>{{lesson.title}}</div>
</li>
</ul>
</li>
</ul>
</div>
</li>
</ul>
Ho provato con $ watch() e $ osservare() per registrare un callback quando i domini cambiano e creare un'istanza del codice tooltip poi. Tuttavia, non riesco a convincermi a chiamarmi al momento giusto. Qualche idea su cosa mi manca?
Forse si potrebbe forzare la compilazione dalla funzione di collegamento. element = angular.element ($ compile (template) (scope)); – dimirc
Se il problema è in attesa del rendering di dom, è possibile includere gli elementi della funzione di collegamento in un timeout $. '$ Timeout (function() {element.find (blabla); element.find (foofoo);}, 0)'. Se questa non è la soluzione, allora il problema non risiede nel rendering dom. – rGil
Sembra che questo sarebbe un problema comune, quindi devo pensare che ci sono modi migliori per farlo senza ricorrere a hack come usare timeout. – chubbsondubs