我建议不要这样做,但你可以覆盖
ngClick
指令以实现你想要的功能。这并不意味着你应该这样做。
考虑到原始实现:
compile: function($element, attr) {
var fn = $parse(attr[directiveName]);
return function(scope, element, attr) {
element.on(lowercase(name), function(event) {
scope.$apply(function() {
fn(scope, {$event:event});
});
});
};
}
我们可以这样覆盖它:
app.config(function ($provide) {
$provide.decorator('ngClickDirective', function ($delegate) {
var directive = $delegate[0];
var origCompile = directive.compile;
directive.compile = function (el, attrs) {
origCompile.apply(this, arguments);
return function (scope, el, attrs) {
var fn = attrs.ngClick;
el.on('click', function (event) {
scope.$apply(function () {
if (!scope[fn]) {
return;
}
if (typeof scope[fn] !== 'function') {
throw new Error('Property ' + fn + ' is not a function on ' + scope);
}
scope[fn].call(null, event);
});
});
};
};
return $delegate;
});
});
然后您可以像这样传递您的函数:
<div ng-click="func"></div>
相对于:
<div ng-click="func()"></div>
jsBin: http://jsbin.com/piwafeke/3/edit
正如我所说的,我不建议这样做,但这是一个概念证明,向您展示,是的-您确实可以覆盖/扩展/增强内置的angular行为以适应您的需求。而不必深入原始实现。
如果您决定走这条路(虽然很有趣),请小心使用。
undefined
应该改为"undefined"
,否则由于typeof
返回的是一个字符串,表达式将总是被判定为假。 - Fabrício Matté$event
。 - a better olivermyFunction
是控制器的一部分。控制器不应该关心用户界面(UI)。此外,一个简单的按钮没有默认操作。而且Angular可以预防很多默认操作。虽然你是正确的,但很难想象有一个好的使用场景。 - a better olivercontextMenu
,它为作用域提供了几个函数(打开、关闭、切换),这些函数是通过特定的contextMenu
名称调用的,例如ng-click="account_menu.toggle()"
。菜单本身位于不同的元素中,例如<div context-menu="account_menu"></div>"
。为了在页面上正确地定位菜单,使其位于调用toggle()
的触发元素正下方,我想访问ng-click
的$event.target
元素,以便获取其坐标。如果有更简单的方法,请告诉我 :) - Elise