2012-10-13 11 views
37

自分のイベントリスナーをAngularJSアプリケーションに登録するにはどうすればよいですか?自分のイベントリスナーをAngularJSに登録するには?

具体的には、Drag and Drop(DND)リスナーを登録しようとしています。そのため、ビューの新しい場所に何かがドラッグ&ドロップされると、AngularJSはビジネスロジックを再計算し、モデルとビューを更新します。

答えて

8

ディレクティブでのイベント処理とDOM操作を非表示にすることは、かなり多くの角度の方法です。スコープをコールします。$イベントが発生したときに適用されて、angleを表示してビューを更新します。

あなたは in this sampleのようにjqueryの-UIを使用して検討するかもしれない

(私はangular-uiグループと連携angular wiki of examples を見て、あなたが有用見つけるかもしれないシンプルなイベントラッパーがあります。

+1

ご回答いただきありがとうございます。私はangularjsには非常に新しいので、私はそれを正しく使用しているかどうかはわかりません。いずれにしても、jquery-uiサンプルアプリを見て、jquery-drag-start、jqui-drag-end、jqui-drop-end、jqui-drag-受け入れ、およびjqui-drop-commitを実行します。あれは正しいですか?本当?私はJQueryのUIサイトに出かけましたが、これらのディレクティブは表示されませんでした。どこから来たの?これはディレクティブのようなもので、イベントハンドラと同じものを設定しています。あれは正しいですか? –

+0

2つのディレクティブ(jqui-drag-startとjqui-drag-end)を作成したようです。 –

+0

私は今ディレクティブを作成する方法を読んでいます... –

47

イベントリスナーを追加リンク方法で行われますあなたがjquery-uiの.draggable()と.droppable()を使いたいのであれば、elemのパラメータがlinkの関数であることを知ることができるでしょう。下の各ディレクティブは実際にはjQueryオブジェクトですから、elem.draggable()に電話して、そこで何をするかを指定してください。

ここ

は、ディレクティブと角度では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> 

私は役立つことを願っています。

+0

あなたの経験をAngularJSと共有することに本当に感謝しています。私はAngularJSにそれほど知っていたので、今は他のサードパーティーの図書館と一緒に水を濁らない方がいいです。私は絶対にすべてのAngularJSソリューションを探しています。それで私は正しいことを理解していますか?ディレクティブは基本的にイベントですか?それとも、イベントを登録するだけですか?私はこれらの指示をもう少し詳しく聞いて、私が学んだものを報告します。ありがとう! –

+0

ディレクティブは角度の配線です。マークアップからJSコードまで要素と属性を結びつける作業を行います。コントローラーは単にロジックとルールに過ぎず、テンプレートはUIであり、ディレクティブ($ scopeと一緒に)はそれらを結びつけるものです。 –

+3

次のようなことが必要なときはいつでも、ディレクティブを使うことができます:1.再利用可能なコントロール。 2. DOM操作。 3.イベントバインド。 –

3

Benの素晴らしい解決策ですが、originalEventと元の要素にアクセスする必要があることに注意してください。 Mozillaのドキュメントによると、二つの条件https://developer.mozilla.org/en-US/docs/DragDrop/Drag_Operations

  1. ドラッグを満たしていなければならないことはそうディレクティブは、この

    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. 
         }); 
        } 
    }); 
    

    ステップの例により、良好なステップのように見えるかもしれませんはdragstart

のリスナー

  • 真でありますここをクリック http://blog.parkji.co.uk/2013/08/11/native-drag-and-drop-in-angularjs.html

    関連する問題