ボタンをレンダリングする単純なディレクティブがあります。
ディレクティブのリンク機能は次のことを行います。
- 「mouseenter」および「mouseleave」イベントをバインドします。
- 「mouseenter」および「mouseleave」イベントのバインドを解除します。
- 「mouseenter」および「mouseleave」イベントを再度バインドします。
イベントのハンドラーは、単純なメッセージをコンソールに記録します。mouseenter または mouseleave でハンドラーが 1 回呼び出されることを期待します。ただし、ステップ 2 が発生しなかったかのように 2 回実行されます。
ディレクティブのコード:
function ButtonDirective() {
return {
restrict: 'E',
template: '<button><span ng-transclude></span></button>',
transclude: true,
replace: true,
link: function (scope, element, attrs) {
function mouseEnterHandler() {
console.log('mouse enter');
}
function mouseLeaveHandler() {
console.log('mouse leave');
}
element.bind('mouseenter', mouseEnterHandler);
element.bind('mouseleave', mouseLeaveHandler);
element.unbind('mouseenter');
element.unbind('mouseleave');
element.bind('mouseenter', mouseEnterHandler);
element.bind('mouseleave', mouseLeaveHandler);
}
}
}
次のプランカーは問題を示しています。
http://plnkr.co/ocXYYZ2jv09Ch7GDRaat
なぜこのように振る舞うのか、誰にも分かりますか?
更新: JQLite にフォールバックする代わりに jQuery を含めると機能します。残念ながら、それは私にとって選択肢ではありません。