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