I нашел решение спуститься вниз (вверх?) с абстракцией. Я динамически строю весь объект конфигурации директивы, а затем ленивую регистрацию.
См http://plnkr.co/edit/pMsgop6u51zPLqkfWaWT
angular.module('app', ['moduleLazyLoader'])
.controller('mainCtrl', ['$log', function ($log) {
this.list = [
{
name: 'asd',
ctrl: [
'ItemAsdCtrl',
function() {
$log.debug('ItemAsdCtrl');
}
]
},
{
name: 'xyz',
ctrl: [
'ItemXyzCtrl',
function() {
$log.debug('ItemXyzCtrl');
}
]
}
];
}])
.directive('outer', ['factoryLazyLoader', '$log', '$compile', function (factoryLazyLoader, $log, $compile) {
function controller() {}
return {
restrict: 'E',
controller: controller,
controllerAs: 'outer',
bindToController: true,
scope: {
list: '=list'
},
link: function (scope, element, attributes) {
var directives = [];
scope.outer.list = scope.outer.list.map(function (ele, idx) {
var directiveSuffix = ele.ctrl[0];
directiveSuffix[0].toUpperCase();
var directiveName = 'item' + directiveSuffix,
directiveAttrName = directiveName.split(/(?=[A-Z])/).join("-").toLowerCase();
directives.push(directiveAttrName);
factoryLazyLoader.registerDirective([
directiveName,
function() {
return {
restrict: 'E',
replace: true,
controller: ele.ctrl[1],
controllerAs: ele.ctrl[0],
bindToController: true,
template: '<div>{{' + ele.ctrl[0] + ' | json}}</div>',
scope: {
item: '=item'
}
}
}
])
return ele;
});
var tpl = '<div>';
angular.forEach(directives, function (val, idx) {
tpl += '<' + val +' item="outer.list[' + idx + ']">' + '</' + val + '>';
});
tpl += '</div>'
// debugger;
element.replaceWith($compile(tpl)(scope))
}
};
}])
Что вы пытаетесь достичь? Я вижу, что вы используете атрибут ctrl-name в директиве, но директива 'inner' не определяет' ctrlName' в своей области. –
@Miszy Используется здесь https://github.com/angular/angular.js/blob/a5ff651a59933c2c43b81642454ee458f98e1401/src/ng/compile.js#L2086 угловым. На моей стороне это передается через 'script.js @ 64 + 65'. – grasnal
Нет, это не так. Можете ли вы показать мне, что именно в угловом (?) Здесь используется 'ctrlName' или' ctrl-name'? Я думаю, что это типичная проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Если вам нужно получить доступ к контроллеру родительской директивы, вы можете просто использовать поле 'require' во внутренней директиве. –