Ich habe gerade meine Anweisung erhalten, eine Vorlage einzufügen, um sie wie folgt an ihr Element anzuhängen:
# 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>
Ich verwende auch ein jQuery-Plugin namens DataTables. Die allgemeine Verwendung lautet wie folgt: $ ('table # some_id'). DataTable (). Sie können die JSON-Daten an den Aufruf dataTable () übergeben, um die Tabellendaten bereitzustellen, ODER Sie können die Daten bereits auf der Seite haben und den Rest erledigen. Letzteres mache ich, da die Zeilen bereits auf der HTML-Seite sind .
Das Problem ist jedoch, dass ich die dataTable () in der Tabelle # line_items AFTER DOM ready aufrufen muss. Meine obige Direktive ruft die dataTable () -Methode auf, BEVOR die Vorlage an das Element der Direktive angehängt wird. Gibt es eine Möglichkeit, Funktionen nach dem Anhängen aufzurufen?
Danke für Ihre Hilfe!
UPDATE 1 nach Andys Antwort:
Ich möchte sicherstellen, dass die Link-Methode erst aufgerufen wird, nachdem sich alles auf der Seite befindet. Deshalb habe ich die Direktive für einen kleinen Test geändert:
# 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>"
}
Und ich sehe tatsächlich "boo" im div # sayboo.
Dann versuche ich meinen jquery datatable Anruf
.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') %>"
}
Kein Glück da
Dann versuche ich eine Auszeit hinzuzufügen:
.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') %>"
}
Und das funktioniert. Ich frage mich also, was in der Nicht-Timer-Version des Codes schief geht.