scope$ watch在AJAX请求后未调用

【字号: 日期:2024-04-10浏览:48作者:雯心
(adsbygoogle = window.adsbygoogle || []).push({}); 如何解决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。

相关文章: