Контроллер, требуемый директивой, не может быть найден в Angular.JS

#angularjs #controller #directive

#angularjs #контроллер #директива

Вопрос:

Как следует из названия, я получаю эту ошибку с родительской пользовательской директивой (которая определяет контроллер) в ng-view, которая заменяет содержимое шаблоном, содержащим дочернюю пользовательскую директиву (для которой требуется родительский контроллер) и ng-repeat.

Я создал простой plunker для иллюстрации моей проблемы:

Основной шаблон:

 <div class="ng-view">
  <div data-my-parent></div>
</div>
  

Маршрут:

   $routeProvider.when( '/', { 
    template: '<span>View loaded.</span>', 
    controller: [ '$scope', function( $scope ) { 
      $scope.items = [ 'item1', 'item2' ];}]});
  

Родительская директива:

 .directive( 'myParent', function() {
  return {
    replace: true,
    template: '<ul><li data-my-child data-ng-repeat = "item in items"></li></ul>',
    controller: [ '$scope', '$element', '$attrs', function( $scope, $element, $attrs ){}]};})
  

Дочерняя директива:

 .directive( 'myChild', function() {
  return {
    require: '^myParent',
    link: function( scope, element, attrs, controller ) {}};})
  

В принципе, я думаю, что это связано с системой ad hoc transclude (для ng-repeat), но я не знаю точно, является ли это плохим кодированием или ошибкой. Каков наилучший способ избавиться от этой ошибки? Требуется дополнительный контроллер с ‘?’ ?

Ответ №1:

ngView содержимое заменено шаблоном маршрута, поэтому ваш <div data-my-parent></div> get потерян.

Комментарии:

1. Я знаю это, проблема не в этом. Я сделал это специально. Дело в том, что заменяемый контент вызывается первым и выдает ошибку.

2. Нет, это и есть проблема. Проблема в том, что ngView удаляется его содержимое и, следовательно, элемент с myParent не найден (поскольку он удален из DOM). Если вы удалите ngView , он работает нормально: plnkr.co/edit/87A6r166TNX3F0SVmWr4?p=preview

3. Я это тоже знаю… Это всего лишь пример, и я должен использовать ng-view в своем проекте с предопределенным содержимым, содержащим директиву. Прежде чем произойдет маршрутизация, директива MyParent должна быть сгенерирована без ошибок, и В этом весь смысл вопроса. Если возникает ошибка, я думаю, что она должна иметь дело с процессом удаления директивы MyParent из DOM из-за ng-view, прежде чем завершить обработку ее как директивы или чего-то подобного. И это не так тривиально, как вы можете подумать

4. Это не тривиально — вероятно, это невозможно (надежным способом) и, безусловно, плохой дизайн. Серьезно, зачем вам «нужно» использовать директиву с дочерней директивой, которая зависит от контроллера родительской директивы внутри ng-view ?

5. @GregoryBouteiller: Достаточно справедливо. Я также не хочу терять свое время на неконструктивные комментарии. Удачи с компиляцией ваших директив для пользователей без JS. Что касается SEO, пожалуйста, опубликуйте свои результаты, если вы добьетесь успеха, потому что все остальные, похоже, делают это другими способами, поэтому было бы интересно найти более простую альтернативу.