在调用检索我的数据模型后,我遇到了$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}})。
非常感谢任何帮助。
答案 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;
}
};
});