2016-04-11 14 views
0

ng-repeatを更新した後、コールバックをどのように作成するのかを理解するのに問題があります。基本的には、ng-repeatの更新が終わった後にコールバック関数を作成できるようにしたいのです。AngularJS - ng-repeat更新後のコールバック

var app = angular.module('myApp', []); 

app.directive('onLastRepeat', function() { 
    return function(scope, element, attrs) { 
     if (scope.$first) 
      console.log("ng-repeat starting - Index: " + scope.$index) 
     if (scope.$last) setTimeout(function(){ 
      console.log("ng-rpeat finished - Index: " + scope.$index); 
     }, 1); 
    }; 
}); 

app.controller('MyController', function($scope) { 
    $scope.data = [1,2,3,4,5,6,7,8,9,10,12,12,13,14,15,16,17,18,19,20]; 

    $scope.buttonClicked = function() { 
     console.log('Btn clicked'); 
     $scope.randomItems = getRandomItems(this.data.length); 
    }; 
}); 

HTML

<div ng-app="myApp"> 
    <div ng-controller="MyController"> 
     <button ng-click="buttonClicked()">Highlight random</button> 
     <ul class="item" > 
      <li ng-repeat="item in data" ng-class="{highlight: randomItems.indexOf($index) > -1}" on-last-repeat>{{ item }} </li> 
     </ul> 
    </div> 
</div> 

リンクいじるする:現在、これは持っている

https://jsfiddle.net/hbhodgm3/は、どのように「アプリ」は働くあなたがクリックしたとき、それは、データアレイの内容を示していますということです「ハイライト」ボタンを押すと、リスト内の2がランダムにハイライト表示されます。ですから、私の問題は、ハイライト/ DOMレンダリングが完了したときにコールバック関数を使用したいということです。 ng-repeatが実行されたときに$ scope.firstと$ scope.lastを使って最初のng-repeatを実行する方法を見つけましたが、強調表示では動作しません。

は、事前に

おかげで、私は問題を説明するために管理願っています。

+0

は、ループの最後のレンダリングではなく、新しいダイジェストサイクルの更新です:getRandomItems(this.data.length);を推定

は秒を実行するために取ることができるAPI呼び出しです。なぜあなたは '$ scope.randomItems = getRandomItems(this.data.length);の後にあなたのことをしないのですか? –

+0

'$ scope.randomItems = getRandomItems(this.data.length);の後にイベントを処理すると、変更がレンダリングされる前に開始されるように見えます。私は変更(ハイライト)がレンダリングされたときのコールバックを見つけることができるようにしたい。少しのDOMレンダリングでAngularの実験を行い、この場合のリストは10 000+であり、変更がレンダリングされる前にコードの実行が開始されます。 –

+0

リストが長すぎる場合は、リストをスクロールしたり、リストをスクロールしたりするために、ビューが許可する任意のサイズにチャンクするか、またはいくつかを取ることをお勧めします。すべてのクライアントが大規模なデータセットを完全に処理し、完全にそれをレンダリングできるとは期待できません。 –

答えて

0

$ qを参照し、角度の非同期性の仕組みをよりよく理解することを約束します。あなたがキャッチしている何

asyncItems(this.data.length).then(function(randoms){ 

    $scope.randomItems = randoms; 
    //handle post rendering callback 
}); 


function asyncItems(length) { 
    var deferred = $q.defer(); 
    var items = getRandomItems(length); 
    if (items){ 
    deferred.resolve(items); 
    } 
    else { 
    //no items :(
    deferred.reject([]); 
    } 

    return deferred.promise; 
} 
関連する問題