這次帶給大家如何確認ng-repeat渲染完成,確認ng-repeat渲染完成的注意事項有哪些,下面就是實戰案例,一起來看一下。
某個項目,我的網頁中有一個清單<ul>
元素,樣式如下:
其實它是透過Angular
的ng-repeat
形成的,html
中的程式碼是:
<li ng-repeat="for list in lists()" id="{{ list.id }}">{{ list.name }}</li>
圖中下方的新清單 button
,點擊之後就往lists
數組中push
了一個新的list
對象,此時頁面會自動渲染,也對應增加一個<li>
,如下:
注意MyList1
一直是active
狀態的( class="active"
),我的需求是新增list
後,新增的list
設定為active
# #,也就是新增後就變成下面這個樣式:
剛開始我嘗試在button
對應的函式中,往lists
數組中push
了新的list
物件後,使用<a href="http://www.php.cn/code/658.html" target="_blank">document</a>.getElementById
取得到新增的<li>
對象,然後為其添加一個class="active"
,結果發現獲取到的DOM
對象為null
,經過搜尋發現原因是:往lists
陣列push
物件後,陣列改變,所有的<li>
都會重新渲染,在push
完成之後馬上去找新增的DOM
對象,DOM
還沒渲染好,因此是取得不到的。解法是:使用<a href="http://www.php.cn/angularjs/angularjs-examples.html" target="_blank">AngularJS</a>
的指令去監聽ng-repeat
是否渲染完成,在渲染完成後,再去取新增的< li>
對象,這個網路上有很多相關的內容了,程式碼如下:
myapp.directive('repeatFinish', function ($timeout) { return { restrict: "C", link: function (scope, element, attr) { if(scope.$last === true){ $timeout(function () { scope.change_list(element[0]); }, 10); } } } });
上述程式碼建立了一個名為repeatFinish
的指令,restrict: "C "
表示指令放在DOM
的class
中(駝峰形式,即class="repeat-finish"
),scope.$ last === true
表示已經渲染到了最後一個對象,此時執行change_list
函數(定義在控制器中,功能是把當前change
的物件取消active
,然後設定傳入的DOM
物件為active
),element[0]
可以直接取到目前渲染的DOM
元素。注意我使用了$timeout
,10ms
後執行change_list
,我發現直接使用change_list
還是會找不到DOM
,原因不明,期待大神解答。
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
#以上是如何確認ng-repeat渲染完成的詳細內容。更多資訊請關注PHP中文網其他相關文章!