2016-02-29 26 views
1

我有一個帶有link函數的Angular指令,裏面我實例化了一個jQuery插件,如https://plnkr.co/edit/58nOhypt6FRdI4At5jwu所示。Angular link函數是否觸發更改事件?

問題是指令實例化的每一刻都會觸發一個change事件,並且我有一個函數監聽這些change事件(當它們被用戶觸發時)。

link函數是否始終觸發change?或者它是jQuery插件嗎?我收到一個值(來自Ajax請求)並將其放入輸入中。插件不應該「觸摸」它,它應該實例化日期選擇器。

另一點是:讓我們考慮插件更改輸入。這是一個程序化更改和ng-change指令不聽這些程序化更改,對不對?

回答

1

不,link函數不是trigger更改事件。改變事件是由這個代碼觸發:

$datepicker = $(element).datepicker({ 
     format: "dd/mm/yyyy", 
     startDate: 'today', 
     language: 'pt-BR', 
     autoclose: true, 
     todayHighlight: true, 
     forceParse: false 
     }); 
    $datepicker.datepicker('setDate', date); 

這實際上改變了模型$scope.date,這就是爲什麼ng-change被稱爲!

將回答這個問題:

的另一點是:讓我們來看看該插件改變輸入。 這是一個編程式更改,ng-change指令不會 監聽這些程序化更改,對吧?

換句話說:

基本上你是鏈接 事件中改變輸入的格式。

,你可以告訴你的edit()功能,當真正的變化發生,或者你可以簡單地做一個簡單的watch和不使用ngChange指令的解決方法。

$scope.$watch('date', function(newValue, oldValue) { 

    if(newValue!=oldValue&&newValue!='25/12/2018'){ 
     console.log(newValue); 
     console.log(oldValue); 
     $scope.changed = true; 
    } 
    }); 

https://plnkr.co/edit/Yq32mq7fm7niy6eXhrDL?p=preview

在我看來,如果可能。 我不會在項目中使用任何jQuery。

您應該使用角UI的日期選擇器https://angular-ui.github.io/bootstrap/#/datepicker

關於jQuery的reference

DOM操作停止試圖使用jQuery修改DOM中 控制器。真。這包括添加元素,刪除元素,檢索其內容,顯示和隱藏它們。使用內置的 指令,或者在必要時編寫自己的指令,以完成DOM 的操作。請參閱下面的重複功能。

如果您正在努力打破習慣,可以考慮從您的應用程序中刪除jQuery 。真。 Angular擁有$ http服務和強大的 指令,這些指令幾乎總是不必要的。 Angular捆綁銷售 jQLite具有極少數最常用於編寫 Angular指令的功能,特別是與事件綁定。

+0

好的!我想知道如何使用'watch'而不是'ng-change',但我會有很多手錶(我有一個項目列表,每個項目都有一個日期屬性),這可能會讓我的UI變慢。 –

+1

@VictorLeal不使用'watch'。我只建議你'看'作爲**解決方法**。我的主要答案是停止使用** jQuery **並在你的項目中導入https://angular-ui.github.io/bootstrap/#/datepicker,所以不需要像你這樣配置'datepicker' 。 –

+0

我正在做一些測試! –