次のように、テンプレートに要素を追加するためのテンプレートをプルするディレクティブを取得しました。
# 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>
DataTablesというjQueryプラグインも使用しています。その一般的な使用法は次のとおりです:$( 'table#some_id')。dataTable()。JSONデータをdataTable()呼び出しに渡してテーブルデータを提供できます。または、データをページ上に既に持っていて、残りの処理を実行できます。私は後者を行っており、行は既にHTMLページ上にあります。
しかし問題は、DOMの準備が整った後でtable#line_itemsのdataTable()を呼び出さなければならないことです。上記のディレクティブは、テンプレートがディレクティブの要素に追加される前にdataTable()メソッドを呼び出します。追加後に関数を呼び出す方法はありますか?
ご協力ありがとうございました!
アンディの答えの後の更新1:
linkメソッドがページ上にすべてある場合にのみ呼び出されるようにしたいので、少しテストのためにディレクティブを変更しました。
# 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>"
}
そして、div#saybooに実際に「boo」が表示されます。
次に、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') %>"
}
運が悪い
次に、タイムアウトを追加してみます。
.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') %>"
}
そしてそれはうまくいきます。では、タイマー以外のバージョンのコードで何が問題になっているのでしょうか。