范围。$ watch在一个指令中没有被AJAX请求调用

我有以下指令:

MyApp.directive('myFilter', ['$filter','$rootScope', function($filter, $rootScope) { var dir = {}; dir.restrict = 'E'; dir.templateUrl = 'views/myFilter.html'; dir.replace = true; dir.scope = { name: '@', model: '=', }; dir.link = function(scope,el,attrs) { //stuff here } return dir; }]); 

以下是我如何调用它:

 <my-filter model="someField" name="abcd" /> 

当指令someFieldsomeField是空的。 稍后,它通过ajax被检索,并且它的值被填充。

问题是,我怎么看待someField的值更新? 当我从链接方法做到这一点时:

 scope.$watch(scope.model, function() { console.log( "changed, new val: ", scope.model ); } 

这只是在初始化指令时调用一次,然后该值是空的。 当通过ajax(从$http.get )获取值时,这个监视function不会被再次调用。 但是,在显示{{someField}}的页面的其他部分,当获取ajax请求时,该值会更新。 所以我不认为这个问题与ajax请求后执行$scope.apply()

编辑: someField被分配在控制器中。 这里是代码:

 MyApp.controller('myCtrl', ['$scope', '$rootScope', '$routeParams', 'ajax', '$filter', function($scope, $rootScope, $routeParams, ajax, $filter) { var userId = parseInt( $routeParams.userId ); $scope.loaded = false; $scope.someField = ""; //initalize with empty value var load = function(data) { $scope.loaded = true; $scope.someField = data.someField; }; ajax.getUser(userId).success(load); } ]); 

方法ajax.getUser()执行$http.get()并返回它的promise 。 在上面的代码中,调用load方法来设置someField的值。

$watch需要一个可以是函数或string的expression式。 所以,如果你改变它,它会工作

 scope.$watch('model', function() { ... }); 

要么

 scope.$watch(function() { return scope.model; }, function() { ... }); 

看看这个jsFiddle 。