2016-04-11 14 views
0

Ich habe ein paar Probleme damit zu verstehen, wie ich einen Rückruf mache, nachdem ich eine ng-Wiederholung aktualisiert habe. Ich möchte im Grunde eine Rückruffunktion ausführen können, nachdem meine Updates für meine ng-Wiederholung beendet wurden. Derzeit haben diese:AngularJS - Callback nach ng-repeat update

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> 

Link zu fummeln: https://jsfiddle.net/hbhodgm3/

So wie die "App" funktioniert, ist, dass sie den Inhalt des Daten-Array listet dann, wenn Sie auf Der "Highlight" -Knopf markiert zufällig 2 in der Liste. Also mein Problem ist, dass ich eine Callback-Funktion für die Hervorhebung/DOM-Rendering haben möchte. Ich habe einen Weg gefunden, dies für die erste ng-Wiederholung mit $ scope.first und $ scope.last zu tun, um zu überprüfen, wann ng-repeat durchgeführt wird, aber scheint nicht mit der Hervorhebung zu arbeiten.

Hoffnung habe ich es geschafft, das Problem zu erklären,

Vielen Dank im Voraus.

+0

Was Sie fangen sind die letzte Wiedergabe der Schleife, nicht der neue Zyklus Update verdauen. Warum machst du dein Ding nicht nach '$ scope.randomItems = getRandomItems (this.data.length);'? –

+0

Wenn ich nach '$ scope.randomItems = getRandomItems (this.data.length) mit dem Ereignis handle;' scheint es zu starten, bevor die Änderung gerendert wurde. Ich möchte einen Rückruf finden können, wenn die Änderung (Hervorhebung) gerendert wurde. Das Arbeiten mit einem kleinen DOM-Render-Experiment mit Angular und der Liste in diesem Fall ist 10 000+ und dann wird der Code ausgeführt, bevor die Änderung gerendert wurde. –

+0

Wenn die Liste so lang ist, dann ist es wahrscheinlich die beste Vorgehensweise, sie in jede Größe zu zerlegen, die die Ansicht erlaubt, oder etwas zum Glätten des Scrollens durch die Liste zu verwenden. Sie können nicht erwarten, dass jeder Client in der Lage ist, einen so großen Datensatz vollständig zu verarbeiten. –

Antwort

0

Siehe $ q und verspricht für ein besseres Verständnis, wie man mit der asynchronen Natur des eckigen arbeitet.

getRandomItems(this.data.length); Vorausgesetzt ist ein API-Aufruf, der Sekunden dauern könnte auszuführen:

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; 
}