2016-11-08 6 views
0

У меня первая функция:Declare функции внутри другой функции в angularjs

$scope.loadDataFromToMonth= function (from,to,year) { 
    // $scope.loadDataFromToMonthArrivee(from,to,2016); 
    var url = servername+'admin/dashboard/getIncidentDepartByMonthFromTo/'+from+'/'+to+'/'+year; 
    // alert(url); 

    function onSuccess(response) { 
     console.log("+++++getIncidentDepartByMonthFromTo SUCCESS++++++"); 
     if (response.data.success != false) { 
      $scope.payloadgetIncidentDepartByMonthFromTo = response.data.data; 
      var getIncidentDepartByMonthFromTo= $scope.payloadgetIncidentDepartByMonthFromTo; 
      console.log(JSON.stringify(getIncidentDepartByMonthFromTo)); 
      $scope.data = {}; // new object 
      $scope.data.datasets = []; // new array in data object .. 
      $scope.data.labels =[]; 
      var theWholeOb={}; 
      var dataSetObj = {}; //temp object to push into dataset array.. 
      var dataSetObjtwo = {}; 
      /////////////anomalies depart 
      dataSetObj.data = []; 
      dataSetObj.label= 'My First dataset'; 
      dataSetObj.fillColor='rgba(220,220,220,0.2)'; 
      dataSetObj.strokeColor= 'rgba(220,220,220,1)'; 
      dataSetObj.pointColor= 'rgba(220,220,220,1)'; 
      dataSetObj.pointStrokeColor= '#fff'; 
      dataSetObj.pointHighlightFill= '#fff'; 
      dataSetObj.pointHighlightStroke='rgba(220,220,220,1)'; 
      getIncidentDepartByMonthFromTo.forEach(function(data) { 
       var monthNumber = $filter('date')(data.la_date, "MM"); 
       var mun = data.number; 
       $scope.data.labels.push(monthNumber);     
       dataSetObj.data.push(mun); 
      }); 
      $scope.data.datasets.push(dataSetObj);   
     } 
     else { 
      alert("failure"); 
     } 
    }; 
    function onError(response) { 
     console.log("-------getIncidentDepartByMonthFromTo FAILED-------"); 
     //$scope.stopSpin('spinner-0'); 
     console.log(response.data); 
     console.log("Inside getIncidentDepartByMonthFromTo error condition..."); 
    }; 
    //----MAKE AJAX REQUEST CALL to GET DATA---- 
    ajaxServicess.getData(url,username,password, 'GET', '').then(onSuccess, onError); 
}; 

эта функция возвращает этот результат:

$scope.data = { 
    labels: ['Jan', 'Feb' 'Jul'], 
    datasets: [ 
     { 
      label: 'My First dataset', 
      fillColor: 'rgba(220,220,220,0.2)', 
      strokeColor: 'rgba(220,220,220,1)', 
      pointColor: 'rgba(220,220,220,1)', 
      pointStrokeColor: '#fff', 
      pointHighlightFill: '#fff', 
      pointHighlightStroke: 'rgba(220,220,220,1)', 
      data: [75, 59, 80, 81, 56, 55] 
     } 
    ] 
}; 

Он работает хорошо.

У меня есть эта вторая функция, которая возвращает различные данные:

$scope.loadDataFromToMonthArrivee= function (from,to,year) { 
    var url =servername+'admin/dashboard/getIncidentArriveeByMonthFromTo/'+from+'/'+to+'/'+year; 
    //alert(url); 
    function onSuccess(response) { 
     console.log("+++++getIncidentArriveeByDate SUCCESS++++++"); 

     if (response.data.success != false) { 

      $scope.payloadDayMonthYearData = response.data.data; 

      var loadedDataByDayMonthYear= $scope.payloadDayMonthYearData; 
       alert('xxx'+JSON.stringify(loadedDataByDayMonthYear)); 
      $scope.data = {}; // new object 
      $scope.data.datasets = []; // new array in data object .. 
      $scope.data.labels =[]; 
      var theWholeOb={}; 
      var dataSetObj = {}; //temp object to push into dataset array.. 
      var dataSetObjtwo = {}; 
      /////////////anomalies arrivee 
      dataSetObjtwo.data = []; 
      $scope.date=[]; 
      dataSetObjtwo.label='My Second dataset'; 
      dataSetObjtwo.fillColor= 'rgba(151,187,205,0.2)'; 
      dataSetObjtwo.strokeColor= 'rgba(151,187,205,1)'; 
      dataSetObjtwo.pointColor= 'rgba(151,187,205,1)'; 
      dataSetObjtwo.pointStrokeColor= '#fff'; 
      dataSetObjtwo.pointHighlightFill='#fff'; 
      dataSetObjtwo.pointHighlightStroke= 'rgba(151,187,205,1)'; 
      loadedDataByDayMonthYear.forEach(function(data) { 

       var monthNumber = $filter('date')(data.la_date, "MM"); 
       $scope.date.push(monthNumber); 
       var mun = data.number; 
       $scope.data.labels.push($scope.monthNumber); 

       dataSetObjtwo.data.push(mun); 
      }); 
      $scope.data.datasets.push(dataSetObjtwo); 

     } else { 
      alert("failure"); 
     } 
     // $scope.stopSpin('spinner-0'); 
    }; 

    function onError(response) { 
     console.log("-------getIncidentArriveeByDate FAILED-------"); 
     //$scope.stopSpin('spinner-0'); 
     console.log(response.data); 
     console.log("Inside getIncidentArriveeByDate error condition..."); 
    }; 

    //----MAKE AJAX REQUEST CALL to GET DATA---- 
    ajaxServicess.getData(url,username,password, 'GET', '').then(onSuccess, onError); 

}; 

эта функция возвращает этот результат:

$scope.data = { 
    labels: [ 'Jan', 'Feb' 'Jul','Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], 
    datasets: [ 
     { 
      label: 'My Second dataset', 
      fillColor: 'rgba(151,187,205,0.2)', 
      strokeColor: 'rgba(151,187,205,1)', 
      pointColor: 'rgba(151,187,205,1)', 
      pointStrokeColor: '#fff', 
      pointHighlightFill: '#fff', 
      pointHighlightStroke: 'rgba(151,187,205,1)', 
      data: [ 102, 123, 145, 60, 161] 
     } 
    ] 
}; 

Он хорошо работает также, но мой вопрос: Как я могу объявить второй внутри первого и объединить возвращенные данные и получить окончательный результат следующим образом:

$scope.data = { 
    labels: [ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], 
    datasets: [ 
     { 
      label: 'My Second dataset', 
      fillColor: 'rgba(151,187,205,0.2)', 
      strokeColor: 'rgba(151,187,205,1)', 
      pointColor: 'rgba(151,187,205,1)', 
      pointStrokeColor: '#fff', 
      pointHighlightFill: '#fff', 
      pointHighlightStroke: 'rgba(151,187,205,1)', 
      data: [ 102, 123, 145, 60, 161] 
     },{ 
      label: 'My First dataset', 
      fillColor: 'rgba(220,220,220,0.2)', 
      strokeColor: 'rgba(220,220,220,1)', 
      pointColor: 'rgba(220,220,220,1)', 
      pointStrokeColor: '#fff', 
      pointHighlightFill: '#fff', 
      pointHighlightStroke: 'rgba(220,220,220,1)', 
      data: [75, 59, 80, 81, 56, 55] 
     } 
    ] 
}; 

ответ

0

Вы можете использовать услугу $ q, включенную в угловую, это позволяет создавать обещания запускать функции по порядку друг друга.

В вашей первой функции вам понадобятся;

var deferred = $q.defer(); 
//stuff goes here 
function onCompleteSuccess(){ 
    //logic goes here 
    deferred.resolve(); //you can pass back variables too if need be. 
} 
function onFail(){ 
    return deferred.reject; 
} 

Для его использования вы можете:

$scope.masterFunction = function(var1, var2, var3){ 
    $scope.loadDataFromMonth(var1, var2, var3).then(function(){ //can recieve a variable if you need to 
     $scope.loadDataToMonthArivee(var1, var2, var3); 
    } 
} 

Я также заметил, что инстанцирование переменных $ области действия дважды, делая это означает, что вы перезаписать ранее определенную переменные $ области действия, чтобы преодолеть это использование «вар [объект]», чтобы создать частный объект, который то вы будете настаивать на своем главном.

Более подробную информацию о $q here

Edit *

Чтобы объединить свои объекты JSON, удалите следующие в вашей второй функции;

$scope.data = {}; // new object 
$scope.data.datasets = []; // new array in data object .. 
$scope.data.labels =[]; 

Затем, чтобы объединить объекты JSON, просто нажмите свой новый объект на созданный в данный момент объект;

$scope.data1.datasets.push($scope.data2.datasets[0]); 
+0

спасибо сер, но как я объединить results..to получить окончательный reuslt выше упоминалось –

+0

В вашей второй функции, удалить; –

+0

Извините случайно нажатый ввод; $ scope.data = {}; // новый объект $ scope.data.datasets = []; // новый массив в объекте данных. $ scope.data.labels = []; Теперь вам нужно всего лишь $ scope.data.datasets.push (datasetObject2); –

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