【问题标题】:AngularJS passing to directive heavy JSON fileAngularJS传递给指令重的JSON文件
【发布时间】:2014-06-03 08:52:38
【问题描述】:

好吧,我想我找到了图表没有显示的问题,问题可能是我正在从 RESTful 服务器加载沉重的 JSON 对象并将其传递给我正在生成图表的指令,但 json 仍然没有已下载完毕。

JSON 文件几乎是 1mb,我是这样得到的:

在控制器中:

dataArchive.get().then(function(result){
    $scope.getData = result;
});

还有 HTML:

<divng-controller="archiveCtrl">
    <data-graph get-archive-data="getData"></data-graph>
</div>

在指令中:

var chart = function(data){
     var createchart = new AmCharts.makeChart("chartdiv", {
          //
     });
}

var linker = function(scope, element, attrs){
    scope.$watch('data', function(){
        chart(scope.data);
    });
}

directives.directive('dataGraph', function(){
    return {
        restrict: 'E',
        replace: false,
        scope: {
            data: '=getArchiveData'
        },
        template: '<div id="chartdiv"></div>',
        link: linker
    };
});

可能正因为如此,指令模板将被创建为空,并且不会生成图表。 我该如何解决这个问题?

【问题讨论】:

    标签: javascript json angularjs angularjs-directive angularjs-scope


    【解决方案1】:

    您正确使用了$watch,这应该会重新触发图表功能,但我建议您尝试其他一些方法来查看哪些方法有帮助。

    首先,即使data 不存在,watch 函数也会在初始指令链接时触发——它只会返回undefined,所以它第一次会用undefined 调用图表函数,因此,我想,渲染一个空图表。那么,当数据下载完毕,会再次触发$watch,但是可能你的图表函数如果多次调用就不起作用了..?下面的检查怎么样:

    scope.$watch('data', function(){
      if (!scope.data) return
      chart(scope.data);
    });
    

    当我需要等待某个变量的解析时,另一种适用于我的方法是使用$observe,而不是将变量添加到指令的范围内:

    <data-graph get-archive-data="{{ getData }}"></data-graph>
    
    var linker = function(scope, element, attrs){
      attrs.$observe('getArchiveData', function(data){
        if (!data) return;
        chart(data);
      });
    }
    
    directives.directive('dataGraph', function(){
      return {
        restrict: 'E',
        replace: false,
        // Remove below  
        //scope: {
        //    data: '=getArchiveData'
        //},
        template: '<div id="chartdiv"></div>',
        link: linker
      };
    });
    

    【讨论】:

    • Elisse,问题与您描述的完全一样。我尝试了您的解决方案,但显然,使用观察者功能会使 chrome 崩溃。无论如何,我回到了 $watch 方法,现在我已经成功地将 json 对象传递给图形函数,但即使使用 json 对象,图形也不会被创建。我在 DOM 中得到空指令模板,在控制台中没有错误。
    • 好吧,如果你能成功地看到你的链接器函数实际上已经收到了数据,那么我只能猜测问题一定出在你的图表函数的某个地方。另一个猜测是,由于您将 chartdiv 指定为指令模板,因此可能会发生某种竞争条件,即图表函数无法找到要呈现图表的元素。尝试对chartdiv进行硬编码,看看它是否有效——然后你就会知道问题出在指令还是图表函数中!
    • 是的,我也有同样的想法,我硬编码了图表 ID,但结果相同。没错,就是图表功能。奇怪的是,在 Chrome 中有时会被解雇,有时不会。同时在 Firefox/Safari 中不会在清除缓存时触发,只有当我重新加载页面时。但是图表函数编写正确,只是不会被触发。
    • 我会提出关于功能不触发的新问题。我真的不知道为什么会这样。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2015-08-31
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    相关资源
    最近更新 更多