我不建议这样做,但是您可以覆盖该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
就像我说的,我不建议您这样做,但这是一个概念证明,向您表明,是的-实际上,您可以覆盖/扩展/增强内置的角度特性以适应您的需求。无需深入研究原始实现。
如果您决定沿着这条路走,请小心使用(尽管这很有趣)。
undefined
应该是"undefined"
,否则该表达式在typeof
返回字符串时将始终评估为false 。