2015-12-14 4 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. Я думаю, что я мог бы сделать что-то неправильно или неправильно.

Я хотел бы способ, который позволил бы мне удалить DataSet! == undefiend

+1

Я обычно использую функцию проверки, которая возвращает функцию преждевременно, если не удается 'если (TypeOf scope.data ===«неопределенные») {возвращение}' возвращает без чего-либо и существует константы выглядит функция ранняя. Это предотвращает отсрочку отступов от всего вашего основного кода, который должен выполняться. Не уверен, что это решение, которое вы хотите. Единственный другой способ, с которым я могу думать, всегда указывать значение scope.data из вашего источника данных. – Tschallacka

+0

Спасибо за комментарий. Мне, возможно, придется сделать что-то подобное. Это только во всех книгах или учебниках, которые я читаю, там нет никакой проверки, поэтому я предполагаю, что происходит что-то еще. – Softey

ответ

2

Вы должны return из функции ссылку, если scope.data является null

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 Wrong. Если бизнес-логика ожидает/работает не с нулевым значением, то ничего неправильного не возвращается из функции. – Vivek

+0

это вопрос масштабируемости ... если вам нужно сделать это в будущем? – Hitmands

0

Не используйте возврат в вашей функции ссылок, потому что предотвращает возможность добавления дополнительной бизнес-логики, не масштабируется по-моему ...

Просто проверьте, scope.data не является значением falsy, а затем выполняет то, что вам нужно. Falsy значения: false, 0, null, undefined, ''

, если выполнить проверку на одном из этих falsy ценностей if утверждение не выполняется.

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

Смежные вопросы