我刚刚得到我的指令来拉入一个模板以附加到它的元素,如下所示:
# 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:
我想确保链接方法只在页面上的所有内容之后才被调用,因此我更改了指令以进行一些测试:
# 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 中看到了“嘘”。
然后我尝试我的 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') %>"
}
那行得通。所以我想知道代码的非计时器版本出了什么问题?