Ho appena ottenuto la mia direttiva per inserire un modello da aggiungere al suo elemento in questo modo:
# CoffeeScript
.directive 'dashboardTable', ->
controller: lineItemIndexCtrl
templateUrl: "<%= asset_path('angular/templates/line_items/dashboard_rows.html') %>"
(scope, element, attrs) ->
element.parent('table#line_items').dataTable()
console.log 'Just to make sure this is run'
# HTML
<table id="line_items">
<tbody dashboard-table>
</tbody>
</table>
Sto anche usando un plugin jQuery chiamato DataTables. Il suo uso generale è così: $ ('table # some_id'). DataTable (). Puoi trasferire i dati JSON nella chiamata dataTable () per fornire i dati della tabella OPPURE puoi avere i dati già nella pagina e farà il resto. Sto facendo quest'ultimo. Le righe sono già nella pagina HTML .
Ma il problema è che devo chiamare dataTable () nella tabella # line_items DOPO DOM pronto. La mia direttiva sopra chiama il metodo dataTable () PRIMA che il modello sia aggiunto all'elemento della direttiva. Esiste un modo per chiamare le funzioni DOPO l'appendice?
Grazie per l'aiuto!
AGGIORNAMENTO 1 dopo la risposta di Andy:
Voglio assicurarmi che il metodo di collegamento venga chiamato solo DOPO che tutto è sulla pagina, quindi ho modificato la direttiva per un piccolo test:
# CoffeeScript
#angular.module(...)
.directive 'dashboardTable', ->
{
link: (scope,element,attrs) ->
console.log 'Just to make sure this gets run'
element.find('#sayboo').html('boo')
controller: lineItemIndexCtrl
template: "<div id='sayboo'></div>"
}
E in effetti vedo "boo" nel div # sayboo.
Quindi provo la mia chiamata databile jquery
.directive 'dashboardTable', ->
{
link: (scope,element,attrs) ->
console.log 'Just to make sure this gets run'
element.parent('table').dataTable() # NEW LINE
controller: lineItemIndexCtrl
templateUrl: "<%= asset_path('angular/templates/line_items/dashboard_rows.html') %>"
}
Nessuna fortuna lì
Quindi provo ad aggiungere un timeout:
.directive 'dashboardTable', ($timeout) ->
{
link: (scope,element,attrs) ->
console.log 'Just to make sure this gets run'
$timeout -> # NEW LINE
element.parent('table').dataTable()
,5000
controller: lineItemIndexCtrl
templateUrl: "<%= asset_path('angular/templates/line_items/dashboard_rows.html') %>"
}
E questo funziona. Quindi mi chiedo cosa vada storto nella versione non timer del codice?