Angular - 运行`$ digest`而没有`$ scope`

时间:2016-10-26 17:52:00

标签: javascript angularjs

我有一个没有$scope

的控制器
angular.module('todoApp', [])
    .controller('TodoListController', function() {
        var todoList = this;

        todoList.title = "Default title";

        setTimeout(function() {
            todoList.title = "Another title will appear after 5 seconds";
        }, 5000);

        // ...some magic here
    });

并查看:

<h1>Current title: {{TodoListController.title}}</h1>

此代码无法正常运行,因此setTimeout中的函数将无法运行$digest(),而TodoListController.title可以更新$scope

我知道我可以使用$scope.$digest()并使用$digest()。但是 - 没有它可以运行angular吗?我总是访问对象.push。也许通过这个对象?

2 个答案:

答案 0 :(得分:2)

您应该使用$timeout而不是vanilla setTimeout。

angular.module('todoApp', [])
.controller('TodoListController', function($timeout) {
    var todoList = this;

    todoList.title = "Default title";

    $timeout(function() {
        todoList.title = "Another title will appear after 5 seconds";
    }, 5000);

    // ...some magic here
});

从angular使用$timeout将处理开始的摘要周期。

如果您想通知angular进行更新而不延迟,Angulars $ timeout也很有用。在这种情况下,您可以在没有第二个参数的情况下调用它。

$timeout(function(){
    //something outside angular ...
});

传递给$timeout的函数将在下一个摘要周期调用。 这种方式比手动调用$ digest更好,因为它可以防止digest already in progress错误。

答案 1 :(得分:0)

您必须使用超时的角度版本:$ timeout。

https://docs.angularjs.org/api/ng/service/ $超时

此服务会触发角度$ digest过程。