Angularjs と c3 チャート ディレクティブを使用しています。私のテンプレートコンパイルコードは
angular.element(document.body).append($compile(template)($scope));
for ループ内のすべての promise が完了した後にのみ、このテンプレート コンパイル コードを実行したいと考えています。どうすればそれを達成できますか?また、モデル名を動的に割り当てるために $scope[data.chartIdent] を使用しましたが、正しい方法ですか? 以下は私のコントローラーのサンプルコードです。
var chartTabs = [
{
title:' Spend',
pages:[
{
chart_Id:0,
chart_name:"C0",
chart_type:"line",
chart_call_name:"spendAmount"
},
{
chart_Id:1,
chart_name:"C1",
chart_type:"bar"
chart_call_name:"spendItems"
}
]
}
];
var chartArray = chartTabs .pages;
var template = '<div class= "chartsDiv">';
for(var i = 0; i < chartArray .length; i++) {
var eachChart= chartArray [i];
var chartIdent = "chart" + i ;
var chartPromise = dataService.getDataForC3Chart(chart_call_name);
chartPromise .then(function (data) {
$scope[data.chartIdent] = {
data : {
x: 'x',
columns :data.columns,
type : data.chart_type
},
axis : {
x: {
type: 'timeseries',
tick: format: function(value) {
var month = value.getUTCMonth() + 1;
var year = value.getUTCFullYear();
return month + '-' + year;
}
}
},
subchart : {
show : true
}
};
}
}, function (error) {
$scope[data.chartIdent] = {};
alert(error);
});
template += ' <div class="col"> <p class="graphtitle">' + eachDashboard.chart_name + ' </p> <c3-simple id = "chart' + i + '" config="chart' + i + '" ></c3-simple> </div>';
}
template += ' </div>';
angular.element(document.body).append($compile(template)($scope));
$q.all を使用して、テンプレートを動的に作成する方法。ここでは、for ループから外れているため、'i' 値はテンプレートに使用できません。
$scope.createDashboradsforeachTab = function(eachTab) {
var dashboardslayoutArray = eachTab.pages;
var promises = [];
var template = '<div class= "chartsDiv">';
for(var i = 0; i < dashboardslayoutArray.length; i++) {
var eachChart= chartArray [i];
var chartIdent = "chart" + i ;
var chartPromise = dataService.getDataForC3Chart(chart_call_name);
var chartPromise = dataService.getDataForC3Chart(chart_call_name);
promises.push(chartPromise);
}
$q.all(promises)
.then(function(data){
// all promises were resolved here
$scope[data.chartIdent] = {
data : {
x: 'x',
columns :data.columns,
type : data.chart_type
}
};
},function(error) {
$scope[data.chartIdent] ={};
alert(error);
}
);
template += ' <div class="col"> <p class="graphtitle">' + eachDashboard.chart_name + ' </p> <c3-simple id = "chart' + i + '" config="chart' + i + '" ></c3-simple> </div>';
template += ' </div>';
angular.element(document.body).append($compile(template)($scope));
}