LoginSignup
3
4

More than 5 years have passed since last update.

inputのchangeイベントが発火しない時の対処法

Posted at

inputのオートコンプリート問題

input[type="date"]などに入力する際は専用のオートコンプリートが提供されますが、
端末によってchangeイベントが発火しない場合があります。(検証ではHTL21, SC-06Dで再現)
そうなると、ngModelが更新されず困ったことになります。

例えば、validでないとsubmitが押せないようにしていると、入力したのにボタンが押せないという不具合になります。

<form name="form" novalidate>
  <input type="date" name="date" ng-model="user.date" required>
  <button ng-click="update(user)" ng-disabled="form.$invalid || isUnchanged(user)">SAVE</button>
</form> 

対処

directiveなどで要素とngModelを監視して同期させます。

<form name="form" novalidate>
  <input type="date" name="date" ng-model="user.date" required input-date>
  <button ng-click="update(user)" ng-disabled="form.$invalid || isUnchanged(user)">SAVE</button>
</form>

app.directive "inputDate", [
  "$interval"
  ($interval) ->
    return {
      restrict: "A"                                                                                                                                                                          
      require: "ngModel"                                                                                                                                                                     
      link: (scope, element, attrs, ngModel) ->                                                                                                                                              
        interval = $interval (->                                                                                                                                                             
          if ngModel.$viewValue != element.val()                                                                                                                                             
             ngModel.$setViewValue element.val()                                                                                                                                              
        ), 500                                                                                                                                                                              

        # ページ遷移時に$intervalをcancelする                                                                                                                                                                                     
        scope.$on '$stateChangeStart', () ->                                                                                                                                                 
          if angular.isDefined interval                                                                                                                                                      
             $interval.cancel(interval)                                                                                                                                                       
             interval = undefined  
    }
]

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4