Nano Hash - криптовалюты, майнинг, программирование

AngularJS: элемент клонирования, содержащий ng-repeat

Я создаю директиву с Angular 1.6, которая создает фиксированный заголовок для таблицы. Я пытаюсь добиться этого, клонировав заголовок таблицы и исправив это. Все это отлично работает в большинстве моих таблиц. Я использую scope: false, чтобы сохранить родительскую область, поскольку некоторые элементы заголовка ссылаются, например. функции сортировки. Это также работает. Моя проблема связана с одной таблицей, которая создает столбцы на основе массива, потому что я хочу иметь возможность изменять столбцы. Столбцы добавляются с помощью ng-repeat. Когда я клонирую этот заголовок, ng-repeat не клонируется.

Что я могу сделать, чтобы клонировать элемент, содержащий ng-repeat?

HTML таблицы:

<table class="proloen-table no-last-border" table-fix-header>
  <thead class="light-blue-background">
    <tr>
      <th>{{vm.testString}}</th>
      <th ng-repeat="head in vm.tableHeaders">
        <span>{{ head.label | translate }}</span>
        <sorting sortkey="head.sort" color="'white'" filter="vm.state.sorting"></sorting>
      </th>
    </tr>
  </thead>
  ...
</table>

Контроллер (с controllerAs: 'vm') имеет (среди прочего):

vm.testString = 'Test';
vm.tableHeaders = [{label: 'Column1', sort: 'prop1'}, {label: 'Column2', sort: 'prop2'}];

Директива выглядит следующим образом:

.directive('tableFixHeader', function ($window, $compile) {
return {
  restrict: 'A',
  scope: false,
  link: function (scope, element) {
    var clone;

    function init() {
      element.wrap('<div class="fix-table-container"></div>');
      clone = element.clone(true);
      clone.find('tbody').remove().end().addClass('table-header-fixed');
      clone.removeAttr('table-fix-header');
      $compile(clone)(scope);
      element.before(clone);
      resizeFixed();
    }
    function resizeFixed() {        
      clone.find('th').each(function (index) {
        $(this).css('width', element.find('th').eq(index).outerWidth() + 'px');
      });
    }
    function scrollFixed() {
      var offset = $($window).scrollTop(),
        tableOffsetTop = element.offset().top,
        tableOffsetBottom = tableOffsetTop + element.height() - element.find('thead').height();
      if (offset < tableOffsetTop || offset > tableOffsetBottom){
        clone.hide();
      }
      else if (offset >= tableOffsetTop && offset <= tableOffsetBottom && clone.is(':hidden')) {
        clone.show();
      }
    }

    $window.addEventListener('scroll', scrollFixed);
    $window.addEventListener('resize', resizeFixed);

    scope.$on('$destroy', function() {
      $window.removeEventListener('scroll', scrollFixed);
      $window.removeEventListener('resize', resizeFixed);
    });

    init();
  }
};
});

Директива отлично работает для фиксированных столбцов таблиц, и приведенный выше пример отлично клонирует первый «жестко закодированный» столбец вместе с переменной из контроллера. Проблема возникает при клонировании файла ng-repeat. Я просто не могу понять, как клонировать ng-repeat, чтобы он работал и обновлялся при обновлении списка столбцов.


  • Используйте тайм-аут (чтобы сначала дождаться загрузки ng-repeat). $timeout(function(){ init(); }); 10.01.2018

Ответы:


1

Вы можете попробовать отправить событие с помощью $scope.$emit, когда ng-repeat завершит рендеринг. Или создайте свой эмиттер событий и подключите свои директивы;

 app.directive('onFinishRepeat', function(){

     return {
        restrict: 'A',
        link: function($scope) {

           if($scope.$last == true) {
               $scope.$emit('ng-repeat', 'finish');
           } 

        }

     }

 })

app.directive('tableFixHeader', function ($window, $compile) {
return {
  restrict: 'A',
  scope: false,
  link: function (scope, element) {
    var clone;

    function init() {
      element.wrap('<div class="fix-table-container"></div>');
      clone = element.clone(true);
      clone.find('tbody').remove().end().addClass('table-header-fixed');
      clone.removeAttr('table-fix-header');
      $compile(clone)(scope);
      element.before(clone);
      resizeFixed();
    }
    function resizeFixed() {        
      clone.find('th').each(function (index) {
        $(this).css('width', element.find('th').eq(index).outerWidth() + 'px');
      });
    }
    function scrollFixed() {
      var offset = $($window).scrollTop(),
        tableOffsetTop = element.offset().top,
        tableOffsetBottom = tableOffsetTop + element.height() - element.find('thead').height();
      if (offset < tableOffsetTop || offset > tableOffsetBottom){
        clone.hide();
      }
      else if (offset >= tableOffsetTop && offset <= tableOffsetBottom && clone.is(':hidden')) {
        clone.show();
      }
    }

    $window.addEventListener('scroll', scrollFixed);
    $window.addEventListener('resize', resizeFixed);

    scope.$on('$destroy', function() {
      $window.removeEventListener('scroll', scrollFixed);
      $window.removeEventListener('resize', resizeFixed);
    });

    $scope.on('ng-repeat', function(event, data){

        if(data == 'finish') {

           init();

        }

    }) 
  }
};
});

HTML

<table class="proloen-table no-last-border" table-fix-header>
<thead class="light-blue-background">
<tr>
  <th>{{vm.testString}}</th>
  <th ng-repeat="head in vm.tableHeaders" on-finish-repeat>
    <span>{{ head.label | translate }}</span>
    <sorting sortkey="head.sort" color="'white'" filter="vm.state.sorting"></sorting>
  </th>
</tr>
</thead>
 ...
</table>
07.05.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..