AngularJS值不会随着setTimeout的变化而变化

时间:2014-05-15 09:42:15

标签: angularjs

我想在页面初始化后更改范围变量。 我有一个带有以下代码的角度应用程序:

$scope.names = ['Jack'];
append_name = function(){$scope.names.push('Bob');}
setTimeout(append_name, 2000);

我没有看到指定延迟后的值发生变化。 这是plunker http://plnkr.co/edit/FBa2fwb7js8pRNENNJof

2 个答案:

答案 0 :(得分:1)

简答:使用内置$timeout服务代替setTimeouthttp://plnkr.co/edit/nh1jEhocRpXtD0rUTh4k?p=preview

答案很长:https://stackoverflow.com/a/9693933/1418796

答案 1 :(得分:0)

如果您创建角度以外的代码,则需要告诉您使用$ apply

更改某些内容
$scope.names = ['Jack'];
append_name = function() {
   $scope.$apply(function() {
      $scope.names.push('Bob');
   });
};
setTimeout(append_name, 2000);

您可以使用$apply创建方便的高阶函数来包装函数:

function ngWrap($scope, fn) {
    return function() {
        var args = [].slice.call(arguments);
        if ($scope.$$phase) {
            fn.apply(null, args);
        } else {
            return $scope.$apply(function() {
                fn.apply(null, args);
            });
        }
    };
}

这可以像:

一样使用
setTimeout(ngWrap($scope, function() {
    $scope.names.push('Bob');
}), 2000);

还有角度有$ timeout来处理这个问题。