Использовать угловой compileProvider вне блока конфигурации

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

Это был мой первый подход:

function create(myDir) {
   angular.module("app").directive(myDir.name, function() {
   return {
     template:myDir.template
   };
  });
}

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

на основании этого поста: http://weblogs.thinktecture.com/pawel/2014/07/angularjs-dynamic-directives.html

Я обнаружил, что могу использовать compileProvider для выполнения этой работы, но так как compileProvider недоступен вне блока конфигурации, вам нужно его выставить, поэтому я сделал:

var provider = {};
angular.module("app",[]);        

angular.module('app')
.config(function ($compileProvider) {
    //It feels hacky to me too.
    angular.copy($compileProvider, provider);
 });
....

function create(myDir) {
    provider.directive.apply(null, [myDir.name, function () { 
        return { template: myDir.template } }]);
    render(myDir); //This render a new instance of my new directive
}

Удивительно, но это сработало. Но мне не хочется взламывать compileProvider, потому что я использую его не так, как предполагалось, я бы очень хотел узнать, возможно ли правильно использовать compileProvider после запуска приложения.

1 ответ

Решение

Существует список зависимостей, которые могут быть внедрены в config блоки (это встроенные $provide, $injector и все поставщики услуг) и список зависимостей, которые могут быть внедрены в других местах (экземпляры службы и старый добрый $injector). Как вы можете видеть все это constant делает это добавляет зависимость к обоим спискам.

Общий рецепт использования провайдеров за пределами config является

app.config(function ($provide, $compileProvider) {
  $provide.constant('$compileProvider', $compileProvider);
});
Другие вопросы по тегам