Skip to content Skip to sidebar Skip to footer

Angularjs $scope Not Watching Changes From View

I have this small sample in which I hoped to see log messages in browser console indicating $scope watcher is working well, but it's unfortunately not the case.

Solution 1:

You need to use the alias ctrl (not self) in $scope.$watch(...):

<!doctype html><htmlng-app="demo"><head><scriptsrc="bower_components/angular/angular.js"></script><script>var app = angular.module('demo', ['ng']);
    app.controller('demoCtrl', function($scope) {
        var self = this;

        self.searchText = '';
        $scope.$watch('ctrl.searchText', function(n, p) {
            console.log('searchText changed from', n, 'to', p);
        });

    });
    </script></head><bodyng-controller="demoCtrl as ctrl"><inputtype="text"ng-model="ctrl.searchText" /></body></html>

When ng-controller="demoCtrl as ctrl" is used, Angular creates a link to the controller context object this into the scope: $scope.ctrl.

Solution 2:

Change your $watch to:

$scope.$watch(function() {
    returnself.searchText;
  }, function(n, p) {
    console.log('searchText changed from', n, 'to', p);
  });

Solution 3:

In form you used$scope.$watch watching expression should be part of scope or root scope. So you should change your code like this:

<!doctype html><htmlng-app="demo"><head><scriptsrc="bower_components/angular/angular.js"></script><script>var app = angular.module('demo', ['ng']);
    app.controller('demoCtrl', function($scope) {
        var self = this;

        $scope.searchText = '';
        $scope.$watch('searchText', function(n, p) {
            console.log('searchText changed from', n, 'to', p);
        });

    });
    </script></head><bodyng-controller="demoCtrl as ctrl"><inputtype="text"ng-model="searchText" /></body></html>

or use another form and change you code like this:

<head><scriptsrc="bower_components/angular/angular.js"></script><script>var app = angular.module('demo', ['ng']);
    app.controller('demoCtrl', function($scope) {
        var self = this;

        self.searchText = '';
        $scope.$watch(function() { return self.searchText; }, function(n, p) {
            console.log('searchText changed from', n, 'to', p);
        });

    });
    </script></head><bodyng-controller="demoCtrl as ctrl"><inputtype="text"ng-model="ctrl.searchText" /></body></html>

Solution 4:

The answer is simple -

Angular watches the expression on the scope variable and not on the controller instance.

To make the code work you need to do modify the controller code as following

varself = this;

self.searchText = '';
$scope.self = this;
$scope.$watch('self.searchText', function(n, p) {
console.log('searchText changed from', n, 'to', p);
});

Post a Comment for "Angularjs $scope Not Watching Changes From View"