使用'this.$ watch`而不是`$ scope.$ watch`与'Controller As'

Mal*_*kus 10 javascript angularjs angularjs-scope

目前我正在使用Controller As范围控制器的格式.

这非常有效,可以使视图上的值范围清晰易懂.

<div ng-app="myApp" ng-controller="myController as myctrl">
    <ul>
        <li ng-repeat="contact in myctrl.contacts">
            <input type="text" ng-model="contact.name.first" />
        </li>
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

但是,当实现一个$watch我遇到问题,因为它似乎依赖于$scope所以以下将无法正常工作.

angular.module('myApp',[])
.controller('myController',['contacts',function(contacts) {
    this.contacts = contacts;

    this.$watch('contacts', function(newValue, oldValue) {
       console.log({older: oldValue, newer:newValue});
    });

}]);
Run Code Online (Sandbox Code Playgroud)

我得到undefined不是一个参考this没有方法的函数$watch.

有没有办法$watch获得Controller As格式的值?

JS小提琴

gka*_*pak 20

即使有controllerAs格式,它就在$scope那里.

实际上,controllerAs将控制器实例绑定this到$ scope的是什么.
例如controller="myController as myctrl"(幕后):( $scope.myctrl = this其中thismyController实例).

所以,你可以注入并使用$scopefor watch:

.controller('myController', function ($scope, contacts) {
    this.contacts = contacts;

    $scope.$watch(function () {
        return contacts;
    }, function (newValue, oldValue) {...});
});
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,@ExpertSystem 我试过注入 `$scope`,但我试过 `$scope.$watch(this.contacts, ...` 并没有意识到需要以该格式返回的监视值。 (2认同)