Difference between on-change and ng-change
ng-change
ng-change
is a directive provided by Angular core API which internally registers an expression to be called when any change happens in $viewValue
of ng-model
variable (here is the code); assign it an expression such as myFunction()
. That provided expression will evaluate inside the underlying controller scope. After calling an expression it runs a digest cycle to make sure bindings are updated on the view. Besides ng-change
there are other directives used for events, like ng-focus
,ng-mousedown
,ng-submit
, ng-blur
, etc. Here is a list of such directives
on-change
It is a way of calling a JavaScript function on change
of input element value. It will search for the function
which is globally available in context (obviously it will not call the function registered in angular controller) and evaluate it.
Related videos on Youtube
NealR
Updated on July 09, 2022Comments
-
NealR almost 2 years
Below is a pretty straightforward setup for a form drop down list. However, the
on-change
event refuses to fire... unless it's changed tong-change
.This had me stuck for about an hour, since we use the same setup elsewhere in our site (i.e. model property/list/
on-change
directive) without fail.I'm wondering what the difference is between
on-change
andng-change
and why one works in this instance and the other doesn't?View
<select id="grArchive" name="grArchive" class="form-control" options="userList" ng-model="selectedUser" ng-options="user as user.name for user in userList" on-change="showSelected()"> </select>
Controller
scope.selectedUser = {}; scope.userList = []; scope.showSelected = function(){ scope.columns = addColumns; }; var loadUserList = function(data){ scope.userList = $.map(data, function(item){ return {id: item.id, name: item.firstName + ' ' + item.lastName}; }); }
Just in case: the user drop down populates as expected (screen shot below)
-
Misters almost 8 yearsIs funny how people say 'old way'. Which is the new way then?
-
Pankaj Parkar almost 8 years@Misters Oh, my bad, I didn't added it intentionally, I remove
old
word. :( -
Petr Averyanov almost 8 yearsgithub.com/angular/angular.js/blob/… it does not bind any event itself
-
Pankaj Parkar almost 8 years@PetrAveryanov You are partially correct, Thanks for heads up. Actually other events are handled in that way I talked, here you can see.
-
Pankaj Parkar almost 8 yearsThe thing I said partial because, If you look at how
$viewChangeListner
call the registered listner, then you will understand indirectly it does call the register listener onchange
event. Basically there in oneinput
change event, which does call, $setViewValue method to update$viewValue
, which call one method to set$viewValue
to$modelValue
, between that it called$commitValue
method to make changes in$modelValue
in that method only it call listeners of$viewChangeListner
. -
NealR almost 8 yearsI'm still not getting the specifics of what makes them different. Does
on-change
listens for a change in the HTML input element, but doesn't ng-change do the same, by proxy, by listening for a change in the model property via the HTML input element? -
Pankaj Parkar almost 8 years@NealR
ng-change
does get fired when underlyingng-model
value gets changed. Behind the scene angular maintain two value for each value those are$viewValue
&$modelValue
, so when$modelValue
gets change only that time it fires change event by this line