2016-05-16 1 views
0

Я пытаюсь настроить угловую ui-сетку с столбцами x в зависимости от количества объектов view.trend.getTagsList(). $scope.addData() является функцией, вызывающая один раз каждые три секундыПроблемы с настройкой динамических столбцов в угловой-ui-сетке

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

Теперь, как тест я только попытаться извлечь один объект view.trend.getTagsList()[0] со своим списком данных .getData(), который содержит список { x: Date, y: value }.

Мой вопрос: почему угловая-ui-сетка не переписывает столбцы, как в $scope.redoColumns()? Я получаю displayNames к «X» и «Y» в хром вместо TimeStamp и независимо от того, что такое view.trend.getTagsList()[i].getTitle(). Также хочу добавить, что в поле «сортировка по умолчанию» нет: «x».

+0

Попробуйте поставить вызов в $ таймаут: $ таймаут ($ 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 = []; в redoColumn функции

+0

Поместите ваши данные $ scope всегда в один большой объект, чтобы избежать этих проблем. Например $ scope.data.columns = []. Теперь вы можете заменить столбцы, не вызывая проблем. Second + для этого - вы избегаете кодового хаоса и можете связать все данные области $ control с одним значением $ scope.data =; в вашем контроллере. – Steffomio

+0

Я просто хотел очистить массив $ scope.columns. Как вы можете видеть, его также объявили вне функции в более крупном объекте. –