Below is a pretty straightforward setup for a form drop down list. However, the on-change
event refuses to fire... unless it's changed to ng-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
and ng-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)
Definition and Usage The ng-change event is triggered at every change in the value. It will not wait until all changes are made, or when the input field loses focus. The ng-change event is only triggered if there is a actual change in the input value, and not if the change was made from a JavaScript.
NgModelChange is an Angular specific event, which we can use to listen for changes to the user input. It is the @Output property of the ngModel directive, Hence we need to use it along with it. ngModle raises the NgModelChange event, whenever the model changes.
The difference is that the oninput event occurs immediately after the value of an element has changed, while onchange occurs when the element loses focus, after the content has been changed.
The NgModel class has the update property with an EventEmitter instance bound to it. This means we can't use (ngModelChange) without ngModel . Whereas the (change) event can be used anywhere, and I've demonstrated that above with the [value] property binding instead.
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With