这是与this one类似的问题。我的指令中仍然看到异步数据的一些问题。基本上,我有要传递数据的指令,并且该数据是异步获取的。我从这样的指令的scope属性开始执行此操作:
scope: {
myAsyncData: '='
}
在链接函数中,我添加了一个
$watch
,因此我可以基于范围内的值来更新我的模型。像这样的东西:scope.$watch(scope.foo, function() {
//logic based on myAsyncData
}
当我这样做时,我开始收到javascript错误,因为异步数据尚未返回。这就是促使我发布上面链接的问题的原因。因此,然后我将
$watch
更改为以下内容:scope.$watch(scope.foo, function() {
if (angular.isDefined(scope.myAsyncData))
{
//logic based on myAsyncData
}
}
当我这样做时,我没有得到JavaScript错误。但是,返回数据时
$watch
不会再次运行,因此我的 View 无法正确反射(reflect)模型。我尝试在$scope.foo
中分配$timeout
以在返回数据后触发 watch ,但这似乎过于依赖时序并且不是很可靠。我的问题是,与指令中的异步数据进行交互的正确方法是什么?我看过一些示例,这些示例在指令中获取数据,如下所示:
scope.$eval(attrs.myAsyncData);
这似乎并没有改变任何东西。这与上面的
myAsyncData: '='
有什么根本不同吗?我开始怀疑我是否应该仅通过服务获取数据,但是似乎会有完全相同的问题。我也曾想过直接在指令中获取数据,但我不想让指令负责获取数据。我只希望该指令负责显示数据并在用户与其交互时更新 View 。
我可能会缺少一些明显的建议,因此,我将不胜感激。
最佳答案
我不太清楚Misko Hevery的回答,所以我决定使用事件,它们对我来说很好用。
在我的 Controller 中,我像这样加载数据:
$http({method: 'GET', url: 'js/datasets/ips-processed.json'}).
success(function(data, status, headers, config) {
//post load code here and...
$scope.$broadcast("Data_Ready");
在我的指令中,我将
return {
restrict: 'A',
scope: {
donutid: "=",
dataset: "="
},
link: function(scope, elements, attrs) {
scope.$on("Data_Ready", function (){
//here the functionality for this directive
希望它对某人有帮助。