scope $ watch在AJAX请求后未调用
$watch
需要一个可以是函数或字符串的表达式。因此,将其更改为
scope.$watch('model', function { ... });
要么
scope.$watch(function { return scope.model; }, function { ... });
看看这个jsFiddle。
解决方法
我有以下指令:
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" />
首次初始化指令时,someField
则为空。稍后,通过ajax对其进行检索,并填充其值。
问题是,我怎么看待someField
更新的价值?当我从链接方法执行此操作时:
scope.$watch(scope.model,function
{
console.log( "changed,new val: ",scope.model );
}
初始化指令时,仅调用一次,然后该值为空。通过ajax(来自$http.get
)检索值时,不会再次调用此watch函数。但是,在我要显示的页面的其他部分{{someField}}
,该值在获取ajax请求时会更新。因此,我认为问题与$scope.apply
在ajax请求之后执行无关。
编辑:someField
在控制器中分配。这是代码:
MyApp.controller('myCtrl',['$scope','$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
执行a$http.get
并返回其promise
。在上面的代码中,load
调用的方法设置了的值someField
。