为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2019-10-25 14:51:40
我刚刚得到指令,将模板插入到其元素中,如下所示:# 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中看到了“ 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') %>"    }那行得通。因此,我想知道非计时器版本的代码出了什么问题?
查看完整描述

3 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

我遇到了同样的问题,我相信答案确实是不。请参阅Miško的评论和小组中的一些讨论。


Angular可以跟踪它为操纵DOM而进行的所有函数调用均已完成,但是由于这些函数可能会触发异步逻辑,这些逻辑在返回后仍会更新DOM,因此我们不希望Angular知道它。任何回调角度给出了可能有时会工作,但不会是安全的依靠。


与您一样,我们使用setTimeout启发式解决了这一问题。


(请记住,并非所有人都同意我的观点-您应该阅读上面链接上的评论,然后看看您的想法。)


查看完整回答
反对 回复 2019-10-25
  • 3 回答
  • 0 关注
  • 741 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信