Saya punya arahan yang menghapus elemen dom setelah beberapa pemeriksaan izin:
angular.module('app').directive('permissionNeeded', function ($location, $route, SecurityService) {
return {
restrict: 'A',
link: function (scope, element, attributes) {
var permissionNeeded = attributes.permissionNeeded;
if (permissionNeeded) {
if (SecurityService.checkAccess($route.current.name) !== permissionNeeded) {
element.remove();
}
}
}
};
});
Petunjuk berfungsi dengan baik, namun saya tidak dapat mengujinya. Manipulasi DOM (element.remove()) tampaknya dipicu setelah pernyataan yang saya harapkan:
it('should not do anything cos permissions are correct', function () {
$route.current = {
name: 'import'
}
var element = compileTemplate('<span permission-needed="W">Some content goes here</span>');
$rootScope.$digest();
expect(element.html()).toBe(''); // FAIL!!! it's still equals to 'Some Content goes here'
});
Saya telah melihat beberapa jawaban di SO tentang penggunaan fungsi $timeout untuk menunda pernyataan ekspektasi, tetapi apa pun yang saya coba, pernyataan tersebut gagal (element.html() masih sama dengan 'Beberapa konten ada di sini')
Namun, yang lucu (bukan?) adalah jika saya hanya mengubah dom alih-alih menghapusnya dalam arahan saya, pengujian saya baik-baik saja:
angular.module('app').directive('permissionNeeded', function ($location, $route, SecurityService) {
return {
restrict: 'A',
link: function (scope, element, attributes) {
var permissionNeeded = attributes.permissionNeeded;
if (permissionNeeded) {
if (SecurityService.checkAccess($route.current.name) !== permissionNeeded) {
element.html('');
}
}
}
};
});
menggunakan arahan di atas, tes berhasil.
Apakah saya benar ketika saya kira rendering dom belum berakhir ketika saya membuat pernyataan? Jika demikian, apa yang dapat saya lakukan untuk menunda pernyataan saya setelah rendering DOM?
Terima kasih.
Mathieu.