在angularjs中的另一个函数内声明函数

时间:2016-11-08 08:52:16

标签: angularjs json charts

我有我的第一个功能:

 $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]
        }
    ]
};

1 个答案:

答案 0 :(得分:0)

你可以使用angular中包含的$ q服务,这允许你创建promises以按照彼此的顺序触发函数。

在您的第一个功能中,您将需要;

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);
    }  
}

我还注意到你实例化你的$ scope变量两次,这意味着你将覆盖你之前定义的$ scope变量,以克服这种使用“var [object]”创建一个私有对象,然后你会推到你的主要。

有关 $q here

的更多信息

编辑*

要合并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]);