scope $ watch在AJAX请求后未调用

科技 网编 2023-04-11 12:27 194 0

$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

评论区