0

Есть ли способ вставить в шаблон директивы угловую переменную в виде строки? например {{row.name}}, так что угловой не интерпретирует его на странице только в директиве. что-то вроде этого:AngularJS: строка ввода в директиве от контроллера

шаблон директивы:

<div> 
    <div ng-transclude ng-repeat="row in data"> 
    </div> 
</div> 

Прецедент: Я посылаю к директиве от контроллера массива данных. person.name = "John", person.name = "Mike". В этом случае моя страница будет выглядеть следующим образом:

.... 
<div my-directive> 
    Name: {{row.name}} 
</div> 

С другой контроллер я отправить данные: car.weight = 13, car.weight = 44 Для этого случая моя страница будет выглядеть следующим образом:

.... 
<div my-directive> 
    Weight: {{row.weight}} 
</div> 

результат будет выглядеть так: Имя: Имя: или Вес: Вес:

Это потому, что {{row}} не определено

Возможно ли это, или я все понимаю неправильно, и есть другой способ?

+0

ДА, вы можете использовать, как ... –

ответ

2

Вам необходимо добавить row к области трансклюзии. Это связано с тем, что область действия директивы ng-transclude не наследуется от области my-directive, но из внешней (страницы) области.

Один из способов сделать это, чтобы создать специальную директиву включение:

module.directive('myDirectiveTransclude', function() { 
    return { 
    link: function($scope, elem, attrs, ctrl, $transclude) { 
     $transclude(function(dom, transclusionScope) { 
     transclusionScope.row = $scope.row; 
     return elem.append(dom); 
     }); 
    } 
    }; 
}); 

Затем замените ng-transclude с ним:

<div> 
    <div my-directive-transclude ng-repeat="row in data"> 
    </div> 
</div> 
+0

спасибо! просто то, что я искал. Не могли бы вы объяснить шаг за шагом, что делает myDirectiveTransclude? – hhh3112

+0

@ hhh3112 Он получит функцию '$ transclude', которая отвечает за рендеринг транскодированной DOM, предоставленной пользователем my-directive' (например,' Name: {{row.name}} '). Затем он вызывает '$ transclude' с единственным аргументом - функцию связывания _clone_, которая, в свою очередь, вызывается с клоном transcluded DOM в качестве первого аргумента и областью трансключений как второй. – aikoven

+0

@ hhh3112 Функция '$ scope' внутри функции' myDirectiveTransclude' является дочерней областью «ng-repeat» (на самом деле будет столько вызовов на 'link', сколько количество элементов в' ng- repeat'), но он также прототипически наследуется от него. «TransclusionScope» также является дочерним элементом области «ng-repeat», но он не прототипически наследует его; вместо этого он наследует от внешней области - той, где была размещена ваша директива. – aikoven

Смежные вопросы