javascript - $scope.$watch 未调用,但 $digest 已在进行中

标签 javascript angularjs

我对$scope.$watch有疑问在调用检索我的数据模型后没有得到评估。我会解释一下,但对于不耐烦的人来说,也许你可以根据这个 fiddle 弄清楚发生了什么: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来欺骗 watch 重新评估都调用ctrl.loadData()和实际的loadData里面方法,但收到此错误:

$digest already in progress

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

任何帮助将不胜感激。

最佳答案

您应该使用 $timeout 而不是 setTimeout,因为 $timeout 将触发摘要周期以使数据在绑定(bind)中可用。

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;
        }
    };
});

关于javascript - $scope.$watch 未调用,但 $digest 已在进行中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18690698/

相关文章:

angularjs - ng-grid 访问排序后的数组数据

javascript - ng-app 在 html 标签中的位置

javascript - Date.UTC() 获取值 null

javascript - extjs,在监听器上获取空值而不是空字符串

javascript - ng-angular 重复过滤器等于和不等于

javascript - ng-repeat 仅显示对象数组中的第一项

Javascript/JSON 如何访问数组的值

javascript - 当父状态改变时如何重新渲染子组件?

javascript - 使用 javascript/jQuery 更改可折叠 div 中的 css 背景图像

javascript - 如何使用 JS spread rest destruction 删除嵌套属性?