Как я могу использовать изолированную область с компонентом и директивой?

Цель здесь состоит в том, чтобы сообщить MainCtrl об обнаружении ошибок в директиве. Ошибка должна отображаться здесь:

<div ng-if="errors[0]">Error 1: {{errors[0]}}</div>

Как я могу получить изолированную область с директивой внутри компонента? Следующее приложение работает, если вы раскомментируете 2 строки, упомянутые ниже. Как есть, я получаю ошибку:

Конфликт за использование нескольких директив

Я умею читать причины. Мне нужно знать, как это исправить, при этом позволяя директиве иметь изолированную область действия. У меня может быть 3-4 таких директивы на странице, и каждой из них нужен свой уникальный errors, который также доступен родителю.

(пример рабочего случая на codepen)

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

app.controller('MainCtrl', function($scope) {
  $scope.errors = [false, false];
  $scope.text = "bobby";
});
	
app.directive('testDirective', function(){
  return {
   restrict: 'A',
    scope: {
      errors: '=',
      text: '@'
   },
    link: function($scope, $element, $attr, ngModel) {
      console.log('link fired');
      console.log('errors: ', $scope.errors);
      console.log('scope.text', $scope.text);

      $attr.$observe('text', function (val) {
        if($scope.text === 'bobby'){
          $scope.errors[0] = true;
        }else{
          $scope.errors[0] = false;
        }
      });
    },
   template: '<p>text: {{ text }} </p>'
     + '<p>errors: {{errors}}</p>'
     + '<p><input type="text" ng-model="errors" /></p>'
  };
});


app.component('panel', {
  bindings: {
  },
  template: [
    '<div>',
    '</div>'
  ].join(''),
  controller: function() {
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.11/angular.min.js"></script>
<section ng-app="app" ng-controller="MainCtrl">
  <h3>Parent Scope</h3>
  <p>errors: {{errors}}</p>
  <input type="text" ng-model="text"></div>
  <div ng-if="errors[0]">Error 1: {{errors[0]}}</div>
  <div ng-if="errors[1]">Error 2: {{errors[1]}}</div>

<!--  UNCOMMENT THE FOLLOWING 2 LINES AND THIS APP WILL WORK
  <h3>Directive by itself</h3>
  <div test-directive text="{{text}}" errors="errors"><div>
  -->
    
  <h3>Directive in component</h3>
  <panel test-directive text="{{text}}" errors="errors"></panel>
  
</section>


person P.Brian.Mackey    schedule 21.07.2017    source источник
comment
Платформа AngularJS не позволяет использовать две изолированные области для одного и того же элемента. Также две директивы с обеими с шаблонами не будут работать. Как вы ожидаете разрешения двух шаблонов? Что вы хотите, чтобы пользователь увидел? Чего вы пытаетесь добиться этим?   -  person georgeawg    schedule 22.07.2017
comment
См. Ошибка: $compile:multidir для директивы компонента с атрибутом Директива для одного исправления.   -  person georgeawg    schedule 22.07.2017
comment
@georgeawg - То, чего я пытаюсь достичь, указано в первой строке вопроса. Вы можете избавиться от шаблона в директиве, это просто плохой пример. Все, что нужно сделать директиве, — это валидация изменений.   -  person P.Brian.Mackey    schedule 23.07.2017
comment
На самом деле у меня есть 4 компонента даты на контроллере. Каждый использует директиву для проверки выбранной даты. А контроллеру нужно знать, есть ли ошибка и какая. Проверка проверки даты может зависеть от выбранной даты в отдельном компоненте даты @georgeawg.   -  person P.Brian.Mackey    schedule 23.07.2017
comment
Например, дата удаления должна быть после даты начала, а также после otherSelectedDate. Ошибка должна указывать, какие элементы управления вызвали ошибку. Таким образом, элемент управления 4 может иметь 0-4 отдельные ошибки.   -  person P.Brian.Mackey    schedule 23.07.2017
comment
Выполняете ли вы специальную проверку с API ngModelController? Кажется, что то, что вы хотите, может быть достигнуто с этим.   -  person georgeawg    schedule 23.07.2017
comment
@georgeawg - это связанный с этим вопрос, заданный ранее: stackoverflow.com/questions/45194560/   -  person P.Brian.Mackey    schedule 24.07.2017


Ответы (1)


После изучения я заметил, что Angular возвращает bool только из $validators (в отличие от object). В этот момент я решил, что мой подход был неправильным. Я решил создать уникальный $valiators для каждого уникального сообщения об ошибке. Затем используйте ng-message для вывода.

Чтобы работать с несколькими компонентами на одной странице, я также должен проверить ngModel.$error как часть проверки. Этот блог описывает базовый подход .

person P.Brian.Mackey    schedule 26.07.2017