Я пытаюсь создать директиву, которая позволила бы определить элемент как интерактивный или нет, и будет определяться следующим образом:
<page is-clickable="true">
transcluded elements...
</page>
Я хочу, чтобы получившийся HTML был:
<page is-clickable="true" ng-click="onHandleClick()">
transcluded elements...
</page>
Моя реализация директивы выглядит следующим образом:
app.directive('page', function() {
return {
restrict: 'E',
template: '<div ng-transclude></div>',
transclude: true,
link: function(scope, element, attrs) {
var isClickable = angular.isDefined(attrs.isClickable) && scope.$eval(attrs.isClickable) === true ? true : false;
if (isClickable) {
attrs.$set('ngClick', 'onHandleClick()');
}
scope.onHandleClick = function() {
console.log('onHandleClick');
};
}
};
});
Я вижу, что после добавления нового атрибута Angular не знает о ng-click
, поэтому он не запускается. Я попытался добавить $compile
после того, как атрибут установлен, но он вызывает бесконечный цикл link/compile.
Я знаю, что могу просто проверить внутри onHandleClick()
функцию, если значение isClickable
равно true
, но мне любопытно, как можно было бы это сделать, динамически добавляя событие ng-click
, потому что мне может понадобиться сделать это с помощью нескольких других директив ng-*
, и я не хочу добавлять лишние накладные расходы. Любые идеи?