Использовать угловой 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);
});