угловая директива, которая условно создает контент

0

Я пытаюсь написать директиву, так что элемент с атрибутом if-login-service="facebook" будет создан, но элемент с любым другим значением для этого атрибута не будет.

Прогресс, который я сделал с этой директивой до сих пор, показан ниже

app.directive('ifLoginService', function($compile) {

  return {
    restrict: 'EA',
    compile: function compile(element, attrs) {

      return function($scope, $element, $attr) {

        var serviceName = attrs.ifLoginService;

        if (serviceName === 'facebook') {

          // use compile to include and compile your content here
          $compile($element.contents())($scope);
        }
      }
    }
  };
});

Демо-версия Plunker доступна здесь. Если он будет работать, кнопка "Facebook" будет отображаться, а кнопка "Not Facebook" - нет. В настоящее время отображаются обе кнопки, но я не уверен, где я ошибаюсь.

  • 0
    Вы можете посмотреть на источник ngIf или просто использовать ng-if в своем шаблоне директивы
  • 0
    @yoavmatchulsky Не могли бы вы показать, как я мог бы использовать ng-if в моем шаблоне директивы?
Показать ещё 4 комментария
Теги:
angularjs-directive

1 ответ

2
Лучший ответ

Вы должны использовать службу компиляции, чтобы написать свою директиву.

$compile('your html content here')($scope);

Чтобы очистить корневой элемент, такой как кнопка, используйте это:

$element[0].html('');

Или удалите его из DOM:

$element[0].parentNode.removeChild($element[0]);

Вот ваша директива отремонтирована:

var app = angular.module('plunker', ['ngSanitize']);

app.controller('MainCtrl', function($scope) {
  $scope.model = {
    toggle: 'true'
  };
});

app.directive('ifLoginService', function($compile,$animate) {

  return {
    restrict: 'EA',
    replace: true,
    compile: function compile(element, attrs) {

      return function($scope, $element, $attr) {

        var serviceName = attrs.ifLoginService;
        console.debug('Testing service name', serviceName);

        if (serviceName === 'true') {
          // use compile to include and compile your content here
          $element.html($compile($element.contents())($scope));
        }
        else
        {
          $element[0].parentNode.removeChild($element[0]);
        }
      }
    }
  };
});

Ссылка на plunkr здесь

  • 0
    Я сделал демо-версию Plunker, основываясь на вашем предложении, но, похоже, оно не работает plnkr.co/edit/AWTPi5?p=preview
  • 0
    Я обновил ваш plunkr, см. Ссылку выше. HTML также изменен, чтобы скрыть / показать директиву, основанную на model.toggle

Ещё вопросы

Сообщество Overcoder
Наверх
Меню