2016-12-05 9 views
0

私は現在、Ionic FrameworkとAngularChartを使ってデータ駆動型のアプリケーションを開発しています。現在、UIが主に設計されている段階に達しています。ユーザーのデータをどのように表示するかについて考える必要があります見る。 AngularChartを使用することを決めたのは明らかです.Cat.jsとAngularで少し経験があるので、実際には意味があります。角度チャートでグラフの種類を動的に設定しますか?

サンドボックス環境で問題のない静的なチャートをいくつか定義しましたが、理想的には、キャンバスのクラスを設定して、残りの部分を引き出すJSON配列の値に従ってチャートのタイプを定義しますこれらの配列要素の

[ 
    { 
     "name": "Fitness", 
     "chart_type": "chart chart-line" 
    }, 
    { 
     "name": "Performance", 
     "chart_type": "chart chart-line" 
    }, 
    { 
     "name": "Weightlifting", 
     "chart_type": "chart chart-line" 
    }, 
    { 
     "name": "Anthropometrics", 
     "chart_type": "chart chart-line" 
    }, 
    { 
     "name": "Sport specific test", 
     "chart_type": "chart chart-line" 
    }, 
    { 
     "name": "Sport lab test", 
     "chart_type": "chart chart-line" 
    } 
] 

1つのメニューから選択し、それがためにアクセス可能なコントローラに$scope.metricに記憶されている(下記参照)

前述のJSON配列は以下であるから、データの次の画面(下のコード)をクリックして、データを正しいチャート形式で表示することができます。明らかにそれらは現時点ではすべて同じですが、私がプロジェクトにさらに進むと、彼らは異なってくるので、私はそれを動的にやりたいと思います。

チャートを示すべきビューを下記のコードは次のとおりです。

<ion-view> 
 
    <div class="bar bar-header bar-stable"> 
 
    <button class="button button-stable button-outline" ng-click="go('home')"> 
 
     <i class="icon ion-ios-home"></i> 
 
    </button> 
 
    <h1 class="title">{{ metric.name }}</h1> 
 
    <button class="button button-stable button-outline" ng-click="logOut()"> 
 
     Log out 
 
    </button> 
 
    </div> 
 
    <ion-content> 
 
    <h2>{{ metric.name }} scores</h2> 
 
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure 
 
     dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 
 
     <br/> 
 
     <br/> 
 
    </p> 
 
    <canvas id="line" class="{{metric.chart_type}}" chart-data="data" chart-labels="labels" chart-series="series" chart-options="options" chart-dataset-override="datasetOverride" chart-click="onClick"></canvas> 
 
    </ion-content> 
 
</ion-view>

私は正しい事を表示しているメトリックオブジェクトは{{metric.name}}部品として正しく保存されていることを知っていますチャートをレンダリングするキャンバス上の要素を調べると、クラスが正しいことがわかりますが、グラフはレンダリングされません(下のスクリーンショットを参照)。私はこのように任意のhelpwouldで間違ったつもりだところ、私は本当にわからないんだけど

The rendered canvas (or lack thereof) and computed class

は大歓迎さ。

EDIT - スコープの変数は、私が望んでいたと思いますどのようにDOMを変異されなかった理由を把握しようとフラストレーションの多大後ので追加しまし関連するコントローラ

angular.module('app') 
 
    .controller('metric_ctrl', function($scope, $state, user_svc, metric_svc, $ionicHistory) { 
 

 
    $scope.metricOptions = [{ 
 
     "name": "Fitness", 
 
     "chart_type": "chart chart-line" 
 
    }, { 
 
     "name": "Performance", 
 
     "chart_type": "chart chart-line" 
 
    }, { 
 
     "name": "Weightlifting", 
 
     "chart_type": "chart chart-line" 
 
    }, { 
 
     "name": "Anthropometrics", 
 
     "chart_type": "chart chart-line" 
 
    }, { 
 
     "name": "Sport specific test", 
 
     "chart_type": "chart chart-line" 
 
    }, { 
 
     "name": "Sport lab test", 
 
     "chart_type": "chart chart-line" 
 
    }]; 
 
    $scope.scores = metric_svc.getScores(); 
 
    $scope.metric = metric_svc.getMetric(); 
 

 
    // console.log($scope.metric.chart_type); 
 

 

 
    $scope.labels = ['T1', 'T2', 'T3', 'T4']; 
 
    $scope.series = ["Weight (Kg)", "BMI (%)"]; 
 
    $scope.data = [ 
 
     [64, 67, 70, 73], 
 
     [17.3, 18.4, 19.2, 20.1] 
 
    ]; 
 
    $scope.options = { 
 
     scales: { 
 
     yAxes: [{ 
 
      id: 'y-axis-1', 
 
      type: 'linear', 
 
      display: true, 
 
      position: 'left', 
 
      scaleLabel: { 
 
      display: true, 
 
      labelString: "Weight (Kg)" 
 
      } 
 
     }, { 
 
      id: 'y-axis-2', 
 
      type: 'linear', 
 
      display: true, 
 
      position: 'right', 
 
      scaleLabel: { 
 
      display: true, 
 
      labelString: "BMI (%)" 
 
      } 
 
     }] 
 
     } 
 
    }; 
 
    $scope.datasetOverride = [{ 
 
     yAxisID: 'y-axis-1' 
 
    }, { 
 
     yAxisID: 'y-axis-2' 
 
    }]; 
 

 

 
    $scope.logOut = function() { 
 
     $scope.user = {}; 
 
     user_svc.setUser($scope.user); 
 
     $state.go('login'); 
 
    }; 
 

 
    $scope.setMetric = function(metric) { 
 
     // console.log('Setting metric to ' + metric); 
 
     $scope.metric = metric; 
 
     metric_svc.setMetric(metric); 
 
     $state.go('metrics_value') 
 
    } 
 

 
    $scope.getScores = function() { 
 
     $scope.scores = metric_svc.getScores(); 
 
     // console.log($scope.scores); 
 
    } 
 

 
    })

+0

$ scope.data、$ scope.labels、$ scope.seriesおよび$ scope.options変数がコントローラで定義され、初期化されていることを確認しましたか? – Vi100

+0

ええ、彼らは私のサンドボックス環境でまったく同じ構造の静的チャートを作成するために使用されてきました。 JSONからクラスを派生させるためにclass = {{metric.chart_type}}を使用して以来、この問題が発生しています。 –

+0

上記のイオンビューのJavaスクリプトコントローラで、$ timeout(function(){});チャートをロードしているすべてのコードの後に​​。それは役に立ちますか? –

答えて

1

、私はAngularChartJSのドキュメントに戻って、本当に簡単な解決策を見つけました。

キャンバスのクラスをchart chart-baseに設定すると、カンバスにchart-typeという属性を指定し、スコープ付き変数が呼び出されたものに設定するだけで、グラフの種類を設定できます。私の場合、これは私が必要とした結果に達するために終わったマークアップでした。もちろん、chart_typeがコントローラに保持されている変数です。

<canvas class="chart chart-base" chart-type="chart_type" chart-data="data" chart-labels="labels" chart-series="series" chart-options="options" chart-dataset-override="datasetOverride" chart-click="onClick"></canvas> 
+0

重要な注意点は、 'chart_type'は 'chart-bar'ではなく 'bar'に設定することです。 – Maksym

関連する問題