范围.在AJAX请求后没有调用指令中的$ watch

Cli*_*ote 39 javascript angularjs

我有以下指令:

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; 
}]);
Run Code Online (Sandbox Code Playgroud)

这是我如何调用它:

<my-filter model="someField" name="abcd" />
Run Code Online (Sandbox Code Playgroud)

当指令首次初始化时,它someField是空的.稍后,它通过ajax检索,并填入其值.

问题是,我该如何看待someField要更新的价值?当我从链接方法执行此操作时:

scope.$watch(scope.model, function()
{
   console.log( "changed, new val: ", scope.model );
}
Run Code Online (Sandbox Code Playgroud)

这只在指令初始化时被调用一次,然后该值为空.当通过ajax(from $http.get)检索值时,不会再次调用此监视功能.但是,在我正在显示的页面的其他部分中{{someField}},该值在获取ajax请求时会更新.所以我不认为问题与$scope.apply()在ajax请求之后做的有关.

编辑: 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);               
}
]);
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ord 92

$watch期望一个表达式可以是函数或字符串.所以,如果你改成它,它会起作用

scope.$watch('model', function() { ... });
Run Code Online (Sandbox Code Playgroud)

要么

scope.$watch(function() { return scope.model; }, function() { ... });
Run Code Online (Sandbox Code Playgroud)

看看这个jsFiddle.

  • 我相信SO是讨论这样的事情的最佳场所,不论是小事还是不事.你可以挑选每个人的大脑,而不仅仅是我的大脑.:) (23认同)
  • @ClickUpvote:像SO这样的系统的目的是让整个社区受益.你要求迈克尔成为你的私人顾问.回到Usenet天,我们没有通过电子邮件回答这个原因. (20认同)
  • 这是真的,但AngularJS问题通常需要很长时间才能得到答案. (2认同)