AngularJSアプリに自分のイベントリスナーを登録するにはどうすればよいですか?
具体的には、ドラッグアンドドロップ(DND)リスナーを登録して、ビューの新しい場所に何かがドラッグアンドドロップされると、AngularJSがビジネスロジックを再計算し、モデルを更新してからビューを更新するようにしています。
イベントリスナの追加は、ディレクティブのリンクメソッドで行われます。以下に、基本的なディレクティブの例をいくつか示しました。ただし、jquery-uiの.draggable()および.droppable()を使用したい場合は、以下の各ディレクティブのelem
関数のlink
パラメーターが実際にjQueryオブジェクト。したがって、elem.draggable()
を呼び出して、そこで行うことを実行できます。
Angularでディレクティブを使用してdragstartをバインドする例を次に示します。
app.directive('draggableThing', function(){
return {
restrict: 'A', //attribute only
link: function(scope, elem, attr, ctrl) {
elem.bind('dragstart', function(e) {
//do something here.
});
}
};
});
使用方法は次のとおりです。
<div draggable-thing>This is draggable.</div>
DivまたはAngularの何かにドロップをバインドする例。
app.directive('droppableArea', function() {
return {
restrict: 'A',
link: function(scope, elem, attr, ctrl) {
elem.bind('drop', function(e) {
/* do something here */
});
}
};
});
使用方法は次のとおりです。
<div droppable-area>Drop stuff here</div>
それがお役に立てば幸いです。
ディレクティブ内でイベント処理とdom操作を非表示にすることは、ほとんどの場合、angularjsの方法です。イベントが発生したときにscope。$ applyを呼び出すと、angularがビューを更新するように指示します。
このサンプルでは のようなjquery-uiを使用することを検討するかもしれません(例の angular wiki を参照してください angular-ui グループで作業し、便利なシンプルなイベントラッパー。
Benによる素晴らしい解決策ですが、originalEventと元の要素にアクセスする必要があることに留意してください。 Mozillaのドキュメントによると、2つの条件を満たしている必要があります https://developer.mozilla.org/en-US/docs/DragDrop/Drag_Operations
したがって、ディレクティブは次のようになります
app.directive('draggableThing', function () {
return function(scope, element, attr) {
var pureJsElement = element[0];
pureJsElement.draggable = true;
element.bind('dragstart', function(event) {
event.originalEvent.dataTransfer.setData('text/plain',
'This text may be dragged');
//do something here.
});
}
});
適切なステップバイステップの例はこちらから入手できます http://blog.parkji.co.uk/2013/08/11/native-drag-and-drop-in-angularjs.html