2016-03-04 23 views
2

有時,當我構建一個Angular自定義指令時,我會聽到一條評論,如果它是一個Angular指令,它不應該在其中使用jQuery代碼,因爲它應該以AngularJS方式構建。如果你構建一個AngularJS自定義指令,在代碼中使用jQuery是不好的做法嗎?

而且我認爲這可能是真的,但它有可能嗎?例如,如果指令模板包含2個部分,其中一個是單詞,另一個是微小圖像(例如審閱星),那麼您的模板中需要2個部分,標記爲.description.star-images - 那麼您應該需要使用$.find(".description")在模板中查找該部分,如果您需要對其進行操作或在其中進行操作。 jqLit​​e將不起作用,因爲jqLit​​e的find()僅限於標籤。

另一個例子是,如果你有一個沒有模板的指令,但只是將按鍵限制在只有數字的位置,比如對於輸入框。所以你不希望你的指令有一個模板<input type="text">,但只希望指令的用戶說<input type="text" digits-input-only>,你的指令叫做digitsInputOnly。所以在這種情況下,你不需要使用jQuery的elem.on()elem.bind()來監聽按鍵事件或keydown事件,並且當按鍵代碼不是數字時,請執行event.preventDefault()?那麼在那種情況下,它必須使用jQuery?

還有其他的方式來做到這一點,讓你真的不需要使用jQuery?

回答

4

在jQuery的很長一段時間的用戶很容易在學習的角度來依靠的jQuery但是,沒有一個提到的情況都難以解決沒有了它,而且在大多數情況下,實際上是更容易

嘗試從項目中完全刪除jQuery來避免誘惑,你很快就會明白你怎麼一點需要

核心指令提供所需的大部分事件處理程序和angular.element (jQlite)也有bind()將接受幾乎任何事件名稱。例如,$document.bind('contextmenu', function(event)

核心DOM事件的指令都讓你在$event傳遞的東西像event.preventDefault()

<input ng-keydown="somefunc($event)"> 

對於穿越你總是可以使用一個本地方法來查詢DOM找到一個元素,換行元素(或集合)在angular.element()中以與$()相同的方式。然而,首先關注數據模型和核心指令的人越多,就越需要實際執行dom遍歷。

至於插件......在指令中使用jQuery插件並不是一種罪過。有一些非常常用的角度模塊,它們是衆所周知的jQuery插件的包裝器... fullcalendar和Datatables是一對很快就會與衆多日期選擇器一起出現的對象。然而,通常情況下,您會發現以前可能依賴插件執行簡單任務的情況,這些任務使角度變得簡單,而您不再使用此類插件。使用jQuery插件的錯誤實際上更容易實現使用角度本身實現(和測試

總之,最大的調整是學習如何在考慮DOM之前先關注數據模型。還熟悉API參考的左側菜單,其中列出了所有核心指令和服務,這是一個巨大的幫助

+0

使用'angular.element()'就像使用jQuery一樣,除了它是一個「微小版本」的jQuery ...所以我的問題是...你應該使用jQuery,你應該甚至使用jqLit​​e嗎? –

+0

最好的辦法是不要使用jQuery ....直到你發現你需要一個比使用angular core更容易實現的插件。請注意,如果您確實使用自己的事件處理程序,那些處理程序中的範圍變化超出了角度上下文,所以您需要告訴角度來運行摘要。首先使用核心指令,而不是經常需要綁定自己的事件處理程序,但是如果您需要'jQlite'來幫助 – charlietfl

+1

如果您還沒有閱讀這篇文章,那麼很值得一讀:[如果我有jQuery背景](http://stackoverflow.com/questions/14994391/thinking-in-angularjs-if-i-have-a-jquery-background) – charlietfl

相關問題