Как использовать функцию «заменить» для пользовательских директив AngularJS?

92

Почему replace=trueили replace=falseне оказывает никакого влияния в коде ниже?

Почему при replace = false не отображается «некоторый существующий контент»?

Или, говоря более скромно, не могли бы вы объяснить, что это за replace=true/falseфункция в директивах и как ее использовать?

пример

JS / Angular:

<script>
    angular.module('scopes', [])
          .controller('Ctrl', function($scope) {
                $scope.title = "hello";

          })
          .directive('myDir', function() {
            return {
              restrict: 'E',
              replace: true,
              template: '<div>{{title}}</div>'
            };
      });
</script>

HTML:

<div ng-controller="Ctrl">
    <my-dir><h3>some existing content</h3></my-dir>
</div>

Смотрите в Plunker здесь:

http://plnkr.co/edit/4ywZGwfsKHLAoGL38vvW?p=preview

Кая Тост
источник
2
@georgeawg пометил это как дубликат другого вопроса, который был задан / ответил позже, чем этот вопрос.
Kaya Toast

Ответы:

189

Когда у вас есть, replace: trueвы получите следующую часть DOM:

<div ng-controller="Ctrl" class="ng-scope">
    <div class="ng-binding">hello</div>
</div>

тогда как replace: falseвы получите это:

<div ng-controller="Ctrl" class="ng-scope">
    <my-dir>
        <div class="ng-binding">hello</div>
    </my-dir>
</div>

Таким образом, replaceсвойство в директивах относится к тому, должен ли элемент, к которому применяется директива ( <my-dir>в этом случае), оставаться ( replace: false), а шаблон директивы должен быть добавлен как его дочерний элемент ,

ИЛИ

элемент, к которому применяется директива, должен быть заменен ( replace: true) шаблоном директивы.

В обоих случаях дочерние элементы элемента (к которому применяется директива) будут потеряны. Если вы хотите сохранить исходное содержимое / дочерние элементы элемента, вам придется их транслютировать. Это сделает следующая директива:

.directive('myDir', function() {
    return {
        restrict: 'E',
        replace: false,
        transclude: true,
        template: '<div>{{title}}<div ng-transclude></div></div>'
    };
});

В том случае, если в шаблоне директивы у вас есть элемент (или элементы) с атрибутом ng-transclude, его содержимое будет заменено исходным содержимым элемента (к которому применяется директива).

См. Пример перевода http://plnkr.co/edit/2DJQydBjgwj9vExLn3Ik?p=preview

См. Это, чтобы узнать больше о переводе.

камилкп
источник
6
Это удивительно простое объяснение. И большое спасибо за разъяснение включения.
Kaya Toast
Что еще более важно, почему это не объясняется на docs.angularjs.org/guide/directive и почему этот ответ не ссылается на окончательный ответ по теме?
Trindaz
3
@Trindaz replaceустарел с AngularJS v1.3 ( ссылка ).
Тончи Д.
33

replace:true не рекомендуется

Из Документов:

replace ([УСТАРЕЛО!] Будет удалено в следующем основном выпуске, то есть v2.0)

укажите, что шаблон должен заменить. По умолчанию false.

  • true - шаблон заменит элемент директивы.
  • false - шаблон заменит содержимое элемента директивы.

- API комплексной директивы AngularJS

Из GitHub:

Caitp - он устарел, потому что есть известные, очень глупые проблемы replace: true, ряд из которых не может быть исправлен разумным способом. Если вы будете осторожны и избегаете этих проблем, тогда у вас больше возможностей, но для новых пользователей проще просто сказать им: «Это вызовет у вас головную боль, не делайте этого».

- Проблема с AngularJS № 7636.


Обновить

Примечание: replace: trueустарел и не рекомендуется использовать, в основном из-за проблем, перечисленных здесь. Он был полностью удален в новом Angular.

Проблемы с replace: true

Для получения дополнительной информации см.

Джорджог
источник
2
Я продолжаю читать, что это должно быть неофициально поддержано в Angular 2, но я не могу понять, как это активировать. Может кто подскажет, что это за синтаксис?
devios1
@devios Мне нужна такая вещь для моих компонентов mdl, но в настоящее время я использую remove-hostобходной путь stackoverflow.com/questions/34280475/… если вы узнаете об активации replace: trueв A2, дайте нам знать.
kuncevic.dev