2015-07-24 3 views
0

У нас есть директива с шаблоном и контроллером.Возьмите контроллер угловой директивы

angular.module('someApp').directive('myDirective', [function() { 
    return { 
     templateUrl:'someTemplate.html', 
     controller: ['$scope', function($scope) { 
      this.someFunction = function() {} 
     }]   
    } 
}]) 

Если попытаться получить контроллер в настоящее время

var directive = angular.element('<my-directive />'); 
$compile(directive)(scope); 
var controller = directive.controller('myDirective'); 

контроллер является неопределенным.

+0

Что вы на самом деле пытаетесь достичь? Другими словами, почему у вас есть необходимость получить контроллер? Возможно, есть лучший подход. –

+0

Мне нужно управлять (создавать, устанавливать данные) мою директиву из службы. Для этого у меня есть функции в контроллере директивы (я прочитал в документации, что директива может использовать свой контроллер для раскрытия API). Поэтому мне нужно получить контроллер директивы для использования этих функций. Честно говоря, я сильно сомневаюсь в этом подходе, но не могу найти другого решения. – andrfas

+1

«... контроллер для отображения API» является правильным, но он предназначен для других директив, которые «требуют» вашей директивы. Это не означает, что API для службы или контроллера не должен иметь дело с DOM. Итак, я не понимаю, что вы подразумеваете под «управлять моей директивой от службы». Службы должны управлять данными - а не директивами –

ответ

0

Ответ заключается в том, чтобы установить шаблон вместо templateUrl в директиве.

angular.module('someApp').directive('myDirective', [function() { 
     return { 
      template:'<span>Solution!</span>', 
      controller: ['$scope', function($scope) { 
       this.someFunction = function() {} 
      }]   
     } 
    }]) 

В документации я ничего не могу найти. Я думаю, что это ошибка.

+0

Это не ошибка - с 'templateUrl', так как шаблон выполняется асинхронно, Angular не останавливается на процессе компиляции до тех пор, пока он не появится. Вызов '$ compile' становится асинхронным. С 'template', вызов является синхронным, и директива также скомпилирована/связана синхронно –

+0

Чтобы прояснить вышеприведенное ... функция' compile' будет по-прежнему возвращать функцию связи синхронно, но это будет функция задержки с привязкой. Асинхронная часть исходит из того факта, что фактическая компиляция 'myDirective' приостановлена ​​до тех пор, пока шаблон не будет извлечен, и поэтому - никакой контроллер еще не присоединен к элементу –

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