这是与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

希望它对某人有帮助。

09-06 04:44
查看更多