2016-06-03 1 views
0

У меня есть угловое приложение, которое использует ng-repeat-start для отображения некоторой динамической информации.Ручное переключение по ссылке с ng-repeat

<div> 
    <table> 
    <tbody> 
     <tr my-directive ng-repeat="data in vm.data"> 
     <td ng-bind="data.id"></td>  
     <td ng-bind="data.id"></td>  
     </tr> 
     <tr ng-repeat-end> 
     <td>extrarow</td> 
     </tr> 
    </tbody> 
    </table> 
</div> 

Я также построил директиву, которую я хочу использовать, чтобы применить класс для всей тра в зависимости от значения некоторых данных. Я хотел использовать ссылку, чтобы сделать это вместо использования $ watch.

Как само по себе может содержать много внутри, я хотел использовать transclude для этого. Я не хочу, тег должен быть вставлен в моей таблице, так как это нарушает все мои стили, так что я должен сделать это вручную, что-то вроде этого:

function myDirective() { 
    return { 
     transclude: true, 
     scope: {}, 
     link: function($scope, $element, $attrs, $ctrl, $transclude) { 
      var cloned = $transclude(); 
      $element.append(cloned);    
     } 
    } 
} 

Проблема заключается в том, это не работает, как ожидалось. Клонированный объект присоединяется только к последней строке ng-repeat. Вероятно, это связано с объектом $ element, но я не уверен в этом.

Я воспроизвел проблему в этом jsfiddle.

Любые идеи о том, где проблема? Большое спасибо.

+0

Не уверен, что вы пытаетесь достичь, но удалить transclude: истинное от вашей директивы, https://jsfiddle.net/tf9s7skq/1/ Если вы просто пытаетесь установить TR класс на основе данных, используйте element.css() - переключение выглядит неправильно. – RamblinRose

+0

Не уверен, что такое transclude: false делает, но вы правы, все мои элементы отображаются, но также и ошибка, поскольку $ transclude больше не является функцией. Кроме того, последний extrarow отображается только для последней строки. Кроме того, это простой пример, но в моем приложении у меня действительно большая таблица со многими ячейками в строке; поэтому я использую transclude, я не хочу терять эти ячейки при применении директивы. – David

+0

Хорошо, @RamblinRose, я просто понимаю, что вы правы, так как у меня нет шаблона, мне не нужно использовать transclude, это намного проще. Спасибо – David

ответ

1

Я одурманен, почему вы требуете transclude. Я думаю this is what you're looking for; однако я должен сказать, что я не уверен в том, что здесь наблюдается экономия $ watch over $ watch.

за $ наблюдать, я добавил следующее ТР:

<tr my-directive data-value="{{data.id}}" ng-repeat="data in vm.data"> 

и директива демонстрирует изменение класса на некоторых условиях.

function myDirective() { 
     return { 
     link: function($scope, element, attrs) { 
      attrs.$observe('value', function(val) { 
      if (val && val == "9.2") 
       element.addClass("myClass"); 
      else 
       element.removeClass("myClass"); 
      });    
     } 
    } 
    } 
+0

Спасибо, @RamblinRose, вы были правы; ранее я использовал шаблон, и мне пришлось использовать transclude; Я просто не понимал, что в этом случае мне больше не нужно было. – David

0

Если вы просто хотите добавить класс в зависимости от вашего контента, который вы можете использовать ng-class

<td ng-bind="data.id" ng-class="{'myClass': data.id > 4}"></td> 

EDIT

Вы можете использовать один раз связывания, то вам не нужно много $watchers

<td ng-bind="data.id" ng-class="::{'myClass': data.id > 4}"></td> 
+0

Я знаю, я не хочу использовать ng-класс. Я должен повторять что-то подобное много раз в моем столе, и это добавляет много $$ наблюдателей. Я хочу использовать $ observ для этого, и поэтому мне нужно использовать transclude. – David

+0

Я отредактировал мое сообщение –

+0

Нет, мой класс динамичен, а также data.id, который я использую, поэтому одноразовая привязка не является вариантом. – David

1

Установка transclude к ложным в своей директиве даст вам весь список.

0

Если вы хотите запустить другую настраиваемую директиву ng-repeat, которую вы написали, вы можете установить другой приоритет для своей директивы ng-repeat. Более низкий приоритет, чем директива ng-repeat по умолчанию, заставит его запускать по умолчанию ng-repeat.

Я обновил свой jsFiddle с образцом, https://jsfiddle.net/1x08vxpm/15/

angular.module('app', []) 

.controller('Controller', Controller)  
.directive('ngRepeat', ngRepeat); 

function ngRepeat() { 
    return {  
     priority: 0, 
     scope: {}, 
     link: function($scope, $element, $attrs) { 
      $element.css('color', 'red'); 
     } 
    } 
} 
+0

Я хочу, чтобы иметь возможность использовать директиву в , применять стиль для строк, а также в , для отдельных ячеек, поэтому я не могу использовать этот. Это хорошая идея для других сценариев. – David