39

我有以下指令:

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 (from $http.get) 检索值时,不会再次调用此 watch 函数。但是,在我正在显示的页面的其他部分,{{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);               
}
]);

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

4

1 回答 1

92

$watch需要一个可以是函数或字符串的表达式。所以,如果你把它改成

scope.$watch('model', function() { ... });

或者

scope.$watch(function() { return scope.model; }, function() { ... });

看看这个 jsFiddle

于 2013-08-09T03:24:03.263 回答