$ scope。$ watch未调用,但$ digest已在进行中

时间:2013-09-09 02:21:59

标签: javascript angularjs

在调用检索我的数据模型后,我遇到了$scope.$watch没有得到评估的问题。我会解释,但是对于不耐烦的人,也许你可以根据这个小提琴弄清楚发生了什么:http://jsfiddle.net/ADukg/3964/

在我们的Angular项目中,我们让一些指令构建自己的数据模型,有时也会传递给其他包含的指令。在这种情况下,构建自己的模型的指令是myMessages,其数据传递的指令是myObjects

myMessages指令依赖于名为messageManager的服务来随时获取与其相关的消息(在我们的代码中,这基于$routeParams值之类的内容,例如, http://localhost/messages/34)。对于我的例子,我只是忽略了参数并直接传回数据。

有趣的是,如果我注释掉第55行和第68行(包裹setTimeout调用),这段代码就可以“正常”了(我把它放在引号中因为,好吧,我真的不确定如果它实际使用良好实践或不)。但是,保持调用以模拟HTTP请求,objects指令的myObjects方法中的link范围变量的值为空,并且针对变量设置的监视失败2秒后跑。

我尝试通过在$scope.$apply调用和实际ctrl.loadData()方法内部显式调用loadData来欺骗手表重新评估,但收到此错误:

  

$ digest已在进行中

查看文档,似乎这是正确的,因为当我们进行这些调用时,我们仍然在Angular上下文中(我们在服务中使用ngResource,所以它不会调用某些jQuery上下文或任何东西奇怪)。无论我尝试什么(包括将objects函数的第三个参数设置为{},我似乎无法在填充数据后对$scope.$watch变量进行重新评估。 {1}})。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您应该使用$timeout代替setTimeout,因为$timeout会触发摘要周期,以便在绑定中提供数据。

myApp.factory('messageManager', function ($q, $timeout) {
    return {
        getMessages: function () {
            var deferred, promise;

            deferred = $q.defer();
            promise = deferred.promise;

            $timeout(function () {
                deferred.resolve({
                    messages: [{
                        firstName: 'Sam',
                        lastName: 'Rockwell',
                    }, {
                        firstName: 'Nat',
                        lastName: 'Faxon',
                    }, {
                        firstName: 'Jim',
                        lastName: 'Rash'
                    }]
                });
            }, 2000);

            return promise;
        }
    };
});