0

Мне нужна помощь в том, как передавать определения контроллеров в директиву inner, вложенную в директиву outer. Пожалуйста, см. http://plnkr.co/edit/Om2vKdvEty9euGXJ5qan для (не) рабочего примера.Угловая директива> Имя динамического контроллера> Имя контроллера интерполяции

  1. Есть ли способ сделать угловую Interpolate то, что передается по [email protected] в item.ctrlName?
  2. Как использовать controllerAs синтаксис в inner директива?
+0

Что вы пытаетесь достичь? Я вижу, что вы используете атрибут ctrl-name в директиве , но директива 'inner' не определяет' ctrlName' в своей области. –

+0

@Miszy Используется здесь https://github.com/angular/angular.js/blob/a5ff651a59933c2c43b81642454ee458f98e1401/src/ng/compile.js#L2086 угловым. На моей стороне это передается через 'script.js @ 64 + 65'. – grasnal

+0

Нет, это не так. Можете ли вы показать мне, что именно в угловом (?) Здесь используется 'ctrlName' или' ctrl-name'? Я думаю, что это типичная проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Если вам нужно получить доступ к контроллеру родительской директивы, вы можете просто использовать поле 'require' во внутренней директиве. –

ответ

0

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)) 


    } 
}; 
}]) 
1

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

angular.module('docsTabsExample', []) 
    .directive('outer', function() { 
    return { 
     restrict: 'E', 
     transclude: true, 
     scope: {}, 
     templateUrl: '...', // or template 
     controllerAs: 'outer', 
     bindToController: true, // This bind the scope with the controller object 
     controller: function(scope, element, attrs) { 
     } 
    } 
    }) 
    .directive('inner', function() { 
    return { 
     require: '^outer', 
     restrict: 'E', 
     transclude: true, 
     scope: { 
     title: '@' 
     }, 
     controllerAs: 'inner', 
     bindToController: true, // This bind the scope with the controller object 
     templateUrl: '...', // or template 
     controller: function(scope, element, attrs, tabsCtrl) { 
     // tabsCtrl and all the methods on the outer directive 
     }, 
    }; 
}); 

2) Вы установили контроллер: контроллер и контроллер является пустой функцией, но вы можете установить там функцию, как я делал раньше и убедиться поставить bindToController: правда

+0

THX для вашего ответа. Для '1.' мне нужно использовать какой-то контроллер, отличный от' outer', как точный контроллер для 'inner'. Использование 'require:' Я могу получить доступ к контроллеру 'outer', но тогда как я могу сказать' inner' использовать externalCtr.list [x] .ctrl как собственный контроллер? Для '2.' Это как вы сказали, если используете' require: ', но не можете заставить его работать с' controller: '@', name: 'ctrlName', 'combo. – grasnal

+0

aah знаю, я понял. Вам, что передать отдельный контроллер во все внутренние директивы ?. Хорошо, если это так, почему вы хотите это сделать? я думаю, может быть, есть другой способ атаковать эту проблему, а не настраивать контроллер директивы, но создавать что-то вроде api. где внутренний контроллер имеет некоторые методы, которые вызывают методы динамических функций. Знаете ли вы, что я? – Highercomve

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