實戰Directive -- 圖片拖拽顯示
前言
Directive即Angular中常說的"指令",在Angular中通過如下代碼:
@Directive({
selector: [appMyDirctive]
})
export class MyDirective {
...
}
將一個類標註為指令(只指定selector是指令的最簡化的定義)。這樣我們在html模板中使用的時候就可以通過這樣的方式:
<div MyDirective></div>
給使用了我們的指令的DOM中的元素添加自定義行為,如上述代碼中的div。
本篇文章通過一個圖片拖拽的例子讓大家對Directive的使用有一個具體的了解。實現效果為:拖動一個圖片到指定的框中,能顯示圖片。
拖放事件
首先我們需要對HTML中的拖放特性有一個簡單的了解。拖放我們可以將它看作是一個傳輸數據的動作,它有一個源(data source)以及一個目標(data target),也就是說拖放將數據從source傳到了target。
拖放有如下對象/事件:
- DataTransfer對象:我們通過這個對象來傳遞數據,使用方式為Event.dataTransfer。
- draggable屬性:即標籤元素設置draggable=true才有效果。
- ondragstart 事件:當拖拽元素開始被拖拽的時候觸發的事件,此事件作用在被拖曳元素上。
- ondragenter 事件:當拖曳元素進入目標元素的時候觸發的事件,此事件作用在目標元素上。
- ondragover 事件:拖拽元素在目標元素上移動的時候觸發的事件,此事件作用在目標元素上。
- ondragleave 事件:拖拽元素在目標元素上移動的時候觸發的事件,此事件作用在目標元素上。
- ondrop 事件:被拖拽的元素在目標元素上同時滑鼠放開觸發的事件,此事件作用在目標元素上。
- ondragend 事件:當拖拽完成後觸發的事件,此事件作用在被拖曳元素上。
- event.preventDefault() 方法:阻止默認的事件方法等執行。在ondragover中一定要執行preventDefault(),否則ondrop事件不會被觸發。另外,如果是從其他應用軟體或是文件中拖東西進來,尤其是圖片的時候,默認的動作是顯示這個圖片或是相關信息,並不是真的執行drop。此時需要用用document的ondragover事件把它直接幹掉。
- event.setDataTransfer.effectAllowed 屬性:就是拖拽的效果。
- evetn.setDataTransfer.setDragImage() 方法:指定圖片或者文檔元素做拖動時的視覺效果。
上述是在HTML5中的拖放事件說明,在Angular稍顯區別: