У меня есть угловое приложение, которое использует ng-repeat-start для отображения некоторой динамической информации.
<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>
Я также создал директиву, которую я хочу использовать для применения класса ко всему tr в зависимости от значения некоторых данных. Я хотел использовать ссылку, чтобы сделать это вместо использования $ 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.
Есть идеи о том, где проблема? Большое спасибо.
Я одурманен, почему вам нужно перевести. Я думаю, это то, что вы ищете; однако я должен сказать, что я не уверен в том, что здесь наблюдается экономия $ watch over $ watch.
Для $ observ, я добавил следующее в TR:
<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");
});
}
}
}
Установка transclude to false в вашей директиве даст вам весь список.
Если вы хотите запустить другую настраиваемую директиву 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');
}
}
}
Если вы просто хотите добавить класс в зависимости от вашего контента, вы можете использовать ng-class
<td ng-bind="data.id" ng-class="{'myClass': data.id > 4}"></td>
РЕДАКТИРОВАТЬ
Вы можете использовать привязку в один раз, тогда вам не нужно много $watchers
<td ng-bind="data.id" ng-class="::{'myClass': data.id > 4}"></td>