溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

AngularJS監聽ng-repeat渲染完成的方法

發布時間:2020-08-24 20:49:10 來源:腳本之家 閱讀:151 作者:Harpsichord1207 欄目:web開發

某個項目,我的網頁中有一個列表<ul>元素,樣式如下:

AngularJS監聽ng-repeat渲染完成的方法

實際上它是通過Angular的ng-repeat形成的,html中的代碼是:

<li ng-repeat="for list in lists()" id="{{ list.id }}">{{ list.name }}</li>

圖中下方的新建清單button,點擊之后就往lists數組中push了一個新的list對象,此時頁面會自動渲染,也對應增加一個<li>,如下:

AngularJS監聽ng-repeat渲染完成的方法

注意MyList1一直是active狀態的(class="active"),我的需求是新增list后,把新增的list設置為active,即在新增后就變成下面這種樣式:

AngularJS監聽ng-repeat渲染完成的方法

剛開始我嘗試在button對應的函數中,往lists數組中push了新的list對象后,使用document.getElementById獲取到新增的<li>對象,然后為其添加一個class="active",結果發現獲取到的DOM對象為null,經過搜索發現原因是:往lists數組push對象后,數組發生改變,所有的<li>都會重新渲染,在push完成之后馬上去找新增的DOM對象,DOM還沒渲染好,因此是獲取不到的。解法是:使用AngularJS的指令去監聽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"表示指令放在DOMclass中(駝峰形式,即class="repeat-finish"),scope.$last === true表示已經渲染到了最后一個對象,此時執行change_list函數(定義在控制器中,功能是把當前active的對象取消active,然后設置傳入的DOM對象為active),element[0]可以直接取到當前渲染的DOM元素。注意我使用了$timeout,10ms后執行change_list,我發現直接使用change_list還是會找不到DOM,原因不明,期待大神解答。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女