Jawaban yang telah diberikan sejauh ini hanya akan berfungsi saat pertama kali ng-repeat
diberikan , tetapi jika Anda memiliki dinamika ng-repeat
, artinya Anda akan menambahkan / menghapus / memfilter item, dan Anda harus diberi tahu setiap kali bahwang-repeat
diberikan, solusi itu tidak akan bekerja untuk Anda.
Jadi, jika Anda perlu diberi tahu SETIAP SAAT bahwa yang di ng-repeat
-re-render dan bukan hanya pertama kali, saya telah menemukan cara untuk melakukan itu, ini cukup 'retas', tetapi akan berfungsi dengan baik jika Anda tahu apa yang Anda lakukan perbuatan. Gunakan ini $filter
di Anda ng-repeat
sebelum Anda menggunakan yang lain$filter
:
.filter('ngRepeatFinish', function($timeout){
return function(data){
var me = this;
var flagProperty = '__finishedRendering__';
if(!data[flagProperty]){
Object.defineProperty(
data,
flagProperty,
{enumerable:false, configurable:true, writable: false, value:{}});
$timeout(function(){
delete data[flagProperty];
me.$emit('ngRepeatFinished');
},0,false);
}
return data;
};
})
Ini akan $emit
acara yang disebut ngRepeatFinished
setiap kaling-repeat
mendapat diberikan.
Bagaimana cara menggunakannya:
<li ng-repeat="item in (items|ngRepeatFinish) | filter:{name:namedFiltered}" >
The ngRepeatFinish
kebutuhan Filter untuk diterapkan langsung ke Array
atau Object
didefinisikan dalam Anda$scope
, Anda dapat menerapkan filter lain setelah.
Bagaimana TIDAK menggunakannya:
<li ng-repeat="item in (items | filter:{name:namedFiltered}) | ngRepeatFinish" >
Jangan menerapkan filter lain terlebih dahulu lalu menerapkan ngRepeatFinish
filter.
Kapan saya harus menggunakan ini?
Jika Anda ingin menerapkan gaya css tertentu ke DOM setelah daftar selesai render, karena Anda harus memperhitungkan dimensi baru elemen DOM yang telah dirender ulang oleh ng-repeat
. (BTW: operasi semacam itu harus dilakukan di dalam arahan)
Apa yang TIDAK HARUS DILAKUKAN dalam fungsi yang menangani ngRepeatFinished
acara:
Jangan melakukan $scope.$apply
dalam fungsi itu atau Anda akan menempatkan Angular dalam loop tanpa akhir yang tidak dapat dideteksi oleh Angular.
Jangan menggunakannya untuk membuat perubahan di $scope
properti, karena perubahan itu tidak akan tercermin dalam tampilan Anda sampai $digest
loop berikutnya , dan karena Anda tidak dapat melakukan itu $scope.$apply
mereka tidak akan ada gunanya.
"Tapi filter tidak dimaksudkan untuk digunakan seperti itu !!"
Tidak, ini bukan hack, jika Anda tidak suka, jangan menggunakannya. Jika Anda tahu cara yang lebih baik untuk mencapai hal yang sama, mohon beri tahu saya.
Meringkas
Ini adalah retasan , dan menggunakannya dengan cara yang salah berbahaya, gunakan hanya untuk menerapkan gaya setelah ng-repeat
rendering selesai dan Anda seharusnya tidak memiliki masalah.
element.ready()
potongan itu? Maksud saya .. apakah ini semacam plugin jQuery yang Anda miliki, atau haruskah dipicu ketika elemen sudah siap?