Angularjs 在指令控制器中未调用Angular$watch

Angularjs 在指令控制器中未调用Angular$watch,angularjs,angularjs-directive,Angularjs,Angularjs Directive,当我在这个“jstree”指令代码中更改作用域的值时(指令链接函数-向重画jstree节点添加一个插件,该插件使用onclick为模式更改向树中的每个项目添加按钮): 控制器中的监视代码未被调用: var TreeController = [ '$scope', 'stateService', '$timeout', function ($scope, stateService, $timeout) { $scope.

当我在这个“jstree”指令代码中更改作用域的值时(指令链接函数-向重画jstree节点添加一个插件,该插件使用onclick为模式更改向树中的每个项目添加按钮):

控制器中的监视代码未被调用:

var TreeController = [
            '$scope', 'stateService', '$timeout',
            function ($scope, stateService, $timeout) {
               $scope.treeUrl = "...";
               $scope.selectedTreeNode = {};
               $scope.mode = 'view';

                var previousSelection;

               $scope.watch('mode', function (name, oldVal, newVal) {
                   stateService.go(newVal);
               });
浏览器之间也有一种奇怪的行为。在firefox 36.0.1(windows)中,一切正常。在firefox中,可以只使用$scope.watch而不使用$,但在chrome中,我得到了一个错误。在chrome中不调用手表中的代码。 我试过深度观察,如第三个参数为true的观察,没有结果。
使用watch可能不是一个好主意,相反,我应该将我的状态服务注入到指令中,直接使用它而不是watch。也许我只是没有按角度来做。

$scope.watch('mode',function(newVal){stateService.go(newVal)});watch回调函数params的定义对我来说也是个谜,直到我意识到第一个是名字。顺便说一句,我使用的是Angular 1.3.14,你有任何plnkr/fiddle吗?$scope.$watch('mode',function(newVal){stateService.go(newVal)})@stepandohnal nope,第一个参数是观察者返回的值,第二个是之前分配给作用域的值。观察者不必是一个简单的模型属性,它可以是一个复杂的函数。它有一个“名字”。
var TreeController = [
            '$scope', 'stateService', '$timeout',
            function ($scope, stateService, $timeout) {
               $scope.treeUrl = "...";
               $scope.selectedTreeNode = {};
               $scope.mode = 'view';

                var previousSelection;

               $scope.watch('mode', function (name, oldVal, newVal) {
                   stateService.go(newVal);
               });