2016-04-11 45 views
0

Bir ng-yinelemeyi güncelledikten sonra nasıl geri arama yaptığımı anlamakta biraz sorun yaşıyorum. Temelde ng-tikamamdaki güncellemelerim bittikten sonra geri arama fonksiyonu yapabiliyorum.AngularJS - ng-yineleme güncellemesinden sonra geri arama

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> 

Bağlantı keman: Şu anda bu var

https://jsfiddle.net/hbhodgm3/ Peki "app" çalışır tıkladığınızda o zaman veri dizinin içeriğini listeler olmasıdır "Vurgula" butonu listede 2'yi rastgele vurguluyor. Yani benim sorunum, vurgulama/DOM-render yapıldığında bir geri çağırma fonksiyonuna sahip olmak istiyorum. Ng-yinelemenin ne zaman yapıldığını kontrol etmek için $ scope.first ve $ scope.last ile başlangıç ​​ng-yinelemesi için bunu yapmanın bir yolunu buldum, ancak vurgulama ile çalışmaz gibi görünmüyor.

Umut ben önceden

Teşekkür sorunu açıklamak başardı.

+0

döngünün son render değil, yeni sindirmek döngüsü güncelleme: getRandomItems(this.data.length); varsayarsak

saniye gerçekleştirmek için sürebilir bir API çağrıdır. Neden sadece $ scope.randomItems = getRandomItems (this.data.length); –

+0

$ scope.randomItems = getRandomItems (this.data.length) öğesinden sonra olayı ele alırsam, bu değişiklik oluşturulmadan önce başlıyor gibi görünüyor. Değişiklik (vurgu) oluşturulduğunda bir geri arama yapabilmeyi istiyorum. Angular ile küçük bir DOM-render denemesi üzerinde çalışmak ve bu durumda liste 10 000+ ve daha sonra kod, değişiklik yapılmadan önce çalışmaya başlar. –

+0

Eğer liste o kadar uzunsa, o zaman belki de listenin ilerleyişini düzeltmek için biraz izin vermesi veya alması için ne kadar büyüklükte olursa olsun onu öbeklemek en iyi uygulamadır. Her müşterinin, tümüyle genişleyen ve işleyen bir veri setiyle mükemmel bir şekilde başa çıkmasını bekleyemezsiniz. –

cevap

0

Köşenin asenkron doğasıyla nasıl çalışılacağının daha iyi anlaşılması için $ q ve Promises bakın. Eğer alıcı konum ne

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; 
} 
İlgili konular