我剛剛得到指令,將模板插入到其元素中,如下所示:# 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啟發式解決了這一問題。
(請記住,并非所有人都同意我的觀點-您應該閱讀上面鏈接上的評論,然后看看您的想法。)
- 3 回答
- 0 關注
- 825 瀏覽
添加回答
舉報
0/150
提交
取消