2016-05-16 9 views
0

view.trend.getTagsList()が返すオブジェクトの数に応じて、xカラムのアングルグリッドグリッドを設定しようとしています。 $scope.addData()は今、テストとして、私は唯一の{ x: Date, y: value }のリストが含まれているデータ.getData()のリストを持つ単一のオブジェクトview.trend.getTagsList()[0]をフェッチしようと3秒ごとアングルグリッドでダイナミックカラムを設定する際の問題

 $scope.columns = []; 


     $scope.setGridColumnWidth = function() { 
      return (100/view.trend.getTagsList().length + 1) + '%'; 
     } 

     $scope.redoColumns = function() { 

      $scope.columns = []; 
      $scope.columns.push({ 
       displayName: 'TimeStamp', field: 'x', width: $scope.setGridColumnWidth(), sort: { 
        direction: uiGridConstants.DESC, 
        priority: 1 
       } 
      }); 

      for (var i = 0; i < view.trend.getTagsList().length; i++) 
       $scope.columns.push({ displayName: view.trend.getTagsList()[i].getTitle(), field: 'y' + view.trend.getTagsList()[i].getId(), width: $scope.setGridColumnWidth() }); 
     } 


     $scope.addData = function() { 

      if (view.trend.getTagsList().length > $scope.columns.length) { 
       $scope.redoColumns(); 
      } 

      $scope.tslab_grid.data = view.trend.getTagsList()[0].getData(); 
     }; 

     $scope.tslab_grid = { 
      enableGridMenu: true, 
      enableColumnResizing: true, 
      enableRowSelection: true, 
      multiSelect: false, 
      enableRowHeaderSelection: false, 
      paginationPageSizes: 18, 
      paginationPageSize: 18, 
      enableVerticalScrollbar: 0, 
      enableHorizontalScrollbar: 2, 
      columnDefs: $scope.columns, 
      data: null 
     }; 

を呼び出す機能です。

私の質問は、なぜ角度-ui-グリッドは$scope.redoColumns()のように列を書き換えないのですか? TimeStampの代わりにchromeのdisplayNamesを 'X'と 'Y'に設定します。view.trend.getTagsList()[i].getTitle()は何でもあります。また、フィールドに「デフォルト」ソートがないことを追加したいとします: 'x'どちらか。

+0

機能redoColumnでみてくださいを削除することによってそれを解決:$タイムアウトを($ scope.redoColumns、0); //キューのように動作します – Steffomio

+0

@Steffomioは動作しませんでした。 –

答えて

0

これを試してみてください:

$scope.redoColumns = function() { 
    var c = []; 
    c.push({ 
     displayName: 'TimeStamp', field: 'x', width: $scope.setGridColumndWidth(), sort: { 
      direction: uiGridConstants.DESC, 
      priority: 1 
     } 
    }); 

    for (var i = 0; i < view.trend.getTagsList().length; i++) 
     c.push({ displayName: view.trend.getTagsList()[i].getTitle(), field: 'y' + view.trend.getTagsList()[i].getId(), width: $scope.setGridColumnWidth() }); 

    $timeout(function(){ 
     $scope.columns = c; 
    }, 0); 
} 
+0

redoColumns()が呼び出されたことがわかりましたが、最初に$ timeoutが認識されず、次に削除されたときに表示されます:TypeError:newRawData.forEachはGrid.modifyRowsの関数ではありません.... –

+0

申し訳ありません。あなた自身のコントローラヘッダーに$ timeoutを加えなければならないと自ら説明しています。 – Steffomio

+0

まだ取得しています: 'TypeError:newRawData.forEachはGrid.modifyRows ...の関数ではありません。 ' –

0

私はちょうど$タイムアウトにコールを入れて$scope.columns = [];

+0

これらの問題を避けるために、常に1つの大きなオブジェクトに$ scopeデータを入れてください。たとえば、$ scope.data.columns = []となります。これで、問題を起こさずに列を置き換えることができます。 2番目の+は、コードカオスを避け、すべてのコントローラ$スコープデータを1つの$ scope.data = dataにリンクすることができます。あなたのコントローラーで。 – Steffomio

+0

$ scope.columns配列を空にしたかっただけです。あなたが見ることができるように、大きなオブジェクトの中で関数の外側に宣言されています。 –

関連する問題