【问题标题】:AngularJS value won't change with setTimeoutAngularJS 值不会随 setTimeout 改变
【发布时间】:2014-05-15 09:42:14
【问题描述】:

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

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

在指定的延迟之后,我看不到值的变化。 这里是 plunker http://plnkr.co/edit/FBa2fwb7js8pRNENNJof

【问题讨论】:

标签: angularjs


【解决方案1】:

简答:使用内置的$timeout 服务而不是setTimeouthttp://plnkr.co/edit/nh1jEhocRpXtD0rUTh4k?p=preview

长答案在这里:https://stackoverflow.com/a/9693933/1418796

【讨论】:

    【解决方案2】:

    如果您在 Angular 之外创建代码,则需要告诉您使用 $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);
    

    还有 angular 有 $timeout 可以处理这个问题。

    【讨论】:

    • 谢谢。我必须为我的socket.io 实现写socket.on('myevent', function(arg){$scope.$apply(function(){trigger_fn(arg)})})。这可能更容易阅读吗?
    • 您可以将socket.on('myevent', ngWrap($scope, trigger_fn)); 与我的回答中的功能一起使用。
    猜你喜欢
    • 2020-10-27
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 2017-05-06
    相关资源
    最近更新 更多