2015-12-14 33 views
0

在我的代码中,我从我的服务传递一个JSON对象数组到我的控制器,然后到我的指令,然后被可视化。只有当没有未定义AngularJS

守则控制器:

(function(){ 

'use strict'; 

angular.module('dashboardApp').controller('DownloadCtrl', DownloadCtrl); 

DownloadCtrl.$inject= ['DownloadService','$scope']; 

function DownloadCtrl(DownloadService, $scope){ 
    var self=this;  

    DownloadService.getRoutes() 
     .then(function(responseData){  
     self.routes = responseData.data; 

    }); 

} 

})(); 

HTML代码:

<div class="container" ng-controller="DownloadCtrl">  

    <donut-chart data='download.routes'></donut-chart> 

</div> 

指令代码:

angular.module('dashboardApp').directive('donutChart',function(){ 

    function link(scope,element,attr){ 
     var dataSet = scope.data; 

     if(dataSet!==undefined){ 
      var chart = c3.generate({ 
       data: dataSet, 
       type:'donut' 
      }); 
     } 
    }; 

    return { 
     restrict: 'EA', 
     link : link, 
     scope: { 
      data: '='  

     } 
    }; 
}); 

如果我范围$看 $ scope.data我注意到。它出现一次,没有数据分配,然后再次出现数据assi指向它。如果我没有dataSet!== undefiend那么代码将失败。

它与当前的设置一起工作,但我觉得有一个更好的方法,而不仅仅是检查是否dataSet!== undefined。我想我可能会以错误的顺序或以不正确的方式完成任务。

我会想办法,让我删除数据集!== undefiend

+1

我通常使用过早返回功能,如果失败'如果(typeof运算scope.data ===“未定义”)确认功能{回报;}'它不返回任何东西,正是如此存在功能早。这样可以防止应该运行的所有主代码引起不必要的缩进。不知道这是否是你想要的解决方案。我可以想到的唯一方法就是始终从数据源中提取scope.data值。 – Tschallacka

+0

感谢您的评论。我可能不得不做那样的事情。这只是在我阅读的所有书籍或教程中没有任何检查,所以我认为还有其他事情正在进行。 – Softey

回答

2

您应该return从链接功能,如果scope.datanull

function link(scope,element,attr){ 
    if(scope.data == null){ 
    return; 
    } 

    var dataSet = scope.data; 

    var chart = c3.generate({ 
     data: dataSet, 
     type:'donut' 
    }); 

}; 
+0

我认为,在链接函数中返回并不是一个好方法,因为如果需要的话,可以阻止您添加更多业务逻辑... – Hitmands

+0

@Hitmands错误。如果业务逻辑期望/在非空值上操作,则从函数返回没有任何错误。 – Vivek

+0

这是一个可扩展性问题......如果您将来需要这样做? – Hitmands

0

不要使用回报在你的链接功能,因为阻止添加更多的业务逻辑的能力,在我看来是不可扩展的...

只要检查是否scope.data不是虚假值,然后做你所需要的。 Falsy值是:false0nullundefined''

,如果你对这些falsy值if说法是不成立的一个执行检查。

{ 
 
    link: function postLink(scope, element, attrs) { 
 
    if(scope.data) { 
 
     d3.generate({ 
 
     data: scope.data 
 
     }); 
 
    } 
 
    } 
 
}

相关问题