編集:この古い、古い回答にはいくつかの問題がありました。
*また: コミュニティ Wiki にマークを付けます (私にはポイントがありません)。エラーのためです。
ディレクティブの N 回の使用に対する N 回の呼び出し。これは、一致する式を持つ同じスコープ内での使用にはおそらく望ましくありません。
イベントハンドラを破壊するものは何もありません!!!! 悪い!悪い!悪い!
だから、私はこの答えを更新しています。うまくいけば、それは誰にもあまり迷惑をかけませんでした.
更新された回答
これは、これらの問題が修正された新しいプランカーです...個々のアプリケーション開発者が遭遇する他の問題がある可能性があります。これは、この問題を処理する方法の単なる例です。
app.factory('clickAnywhereButHereService', function($document){
var tracker = [];
return function($scope, expr) {
var i, t, len;
for(i = 0, len = tracker.length; i < len; i++) {
t = tracker[i];
if(t.expr === expr && t.scope === $scope) {
return t;
}
}
var handler = function() {
$scope.$apply(expr);
};
$document.on('click', handler);
// IMPORTANT! Tear down this event handler when the scope is destroyed.
$scope.$on('$destroy', function(){
$document.off('click', handler);
});
t = { scope: $scope, expr: expr };
tracker.push(t);
return t;
};
});
app.directive('clickAnywhereButHere', function($document, clickAnywhereButHereService){
return {
restrict: 'A',
link: function(scope, elem, attr, ctrl) {
var handler = function(e) {
e.stopPropagation();
};
elem.on('click', handler);
scope.$on('$destroy', function(){
elem.off('click', handler);
});
clickAnywhereButHereService(scope, attr.clickAnywhereButHere);
}
};
});
元の回答 (イベント ハンドラーのティアダウンの修正を含む)
あなたは見つけた 1 つの答えに近づいていましたが、何が欠けているかを示すために、プランクをまとめました。
app.directive('clickAnywhereButHere', function($document){
return {
restrict: 'A',
link: function(scope, elem, attr, ctrl) {
var elemClickHandler = function(e) {
e.stopPropagation();
};
var docClickHandler = function() {
scope.$apply(attr.clickAnywhereButHere);
};
elem.on('click', elemClickHandler);
$document.on('click', docClickHandler);
// teardown the event handlers when the scope is destroyed.
scope.$on('$destroy', function() {
elem.off('click', elemClickHandler);
$document.off('click', docClickHandler);
});
}
}
})
HTML
<a click-anywhere-but-here="clickedSomewhereElse()"
ng-click="clickedHere()">Don't Click Me!</a>