Ответ 1
Вам не нужно перекомпилировать эту директиву, если все, что вам нужно, - это некоторые манипуляции с DOM, вы можете добавлять и удалять класс в отношении изменений свойства scope. Вместо этого вы можете использовать $watch.
JAVASCRIPT
.directive('ngLoading', function() {
return function(scope, element, attrs) {
var img = angular.element('<img class="loading-icon" src="/assets/images/loading-icon.gif"/>');
element.append(img);
scope.$watch(attrs.ngLoading, function(isLoading) {
if(isLoading) {
img.removeClass('ng-hide');
element.addClass('loading');
element.attr('disabled', '');
} else {
img.addClass('ng-hide');
element.removeClass('loading');
element.removeAttr('disabled');
}
});
};
});
Примечание. Ваш код не работает, поскольку он компилирует содержимое элементов, а не сам элемент, в который вы прикрепляете атрибуты, которые вы внедрили.
попробуйте $compile(elem)(scope);
, и он должен работать корректно, но я не рекомендую его, потому что каждый элемент с такой директивой придется снова скомпилировать.
UPDATE:
перед использованием $compile
удалите атрибут 'ngLoading' для элемента, чтобы предотвратить бесконечную компиляцию.
elem.removeAttr('ng-loading');
$compile(elem)(scope);