一尘不染

Angular JS指令有后期渲染回调吗?

angularjs

我刚刚得到了指令,以插入一个模板以附加到其元素,如下所示:

# 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页面上已经有行。

但是问题是我必须在table #line_items AFTER
DOM就绪后调用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中看到了“ 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') %>"
    }

那行得通。因此,我想知道非计时器版本的代码出了什么问题?


阅读 231

收藏
2020-07-04

共1个答案

一尘不染

如果未提供第二个参数“ delay”,则默认行为是在DOM完成渲染之后执行该功能。因此,请使用$ timeout而不是setTimeout:

$timeout(function () {
    //DOM has finished rendering
});
2020-07-04