【发布时间】:2014-04-02 17:06:45
【问题描述】:
我正在尝试创建一个指令,该指令允许将元素定义为可点击或不可点击,并且可以这样定义:
<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,但这会导致无限链接/编译循环。
我知道如果isClickable 的值是true,我可以检查onHandleClick() 函数内部,但我很好奇如何通过动态添加ng-click 事件来执行此操作,因为我可能需要与多个其他 ng-* 指令一起完成此操作,我不想增加不必要的开销。有什么想法吗?
【问题讨论】:
-
我刚开始学习角度,从我所学到的动态添加东西更像是 jQuery 的东西。我认为您应该使用带有静态模板的替代方法。我昨天遇到了同样的情况,如果按钮不可点击,我只是在点击处理程序中执行 if else 并添加一个条件 ng-class 用于样式设置。我同意 angular 的观点,即拥有一个静态模板很容易阅读和预测功能。
-
是的,我暂时只检查点击处理程序内部的
isClickable值......我只是觉得必须有一种方法可以在指令编译阶段添加它!无论我在编译函数中尝试什么,Angular 都不会绑定到函数。 -
在下面查看我的更新答案,了解我最终使用的解决方案。
标签: javascript angularjs angularjs-directive