Подтвердить что ты не робот

Название динамического NG-контроллера

Я хочу динамически указать контроллер на основе загружаемой конфигурации. Что-то вроде этого:

<div ng-controller="{{config.controllerNameString}}>
    ...
</div>

Как это сделать в angular? Я думал, что это будет очень легко, но я могу найти способ сделать это.

4b9b3361

Ответ 1

То, что вы хотите сделать, - это запустить другую директиву до того, как вызывается что-то еще, получить имя контроллера из какой-либо модели, удалить новую директиву и добавить директиву ng-controller, а затем повторно скомпилировать элемент.

Это выглядит так:

global.directive('dynamicCtrl', ['$compile', '$parse',function($compile, $parse) {
  return {
    restrict: 'A',
    terminal: true,
    priority: 100000,
    link: function(scope, elem) {
      var name = $parse(elem.attr('dynamic-ctrl'))(scope);
      elem.removeAttr('dynamic-ctrl');
      elem.attr('ng-controller', name);
      $compile(elem)(scope);
    }
  };
}]);

Затем вы можете использовать его в своем шаблоне, например:

<div dynamic-ctrl="'blankCtrl'">{{tyler}}</div>

с таким контроллером:

global.controller('blankCtrl',['$scope',function(tyler){
    tyler.tyler = 'tyler';
    tyler.tyler = 'chameleon';
}]);

Вероятно, существует способ интерполяции значения ($interpolate) dynamic-ctrl вместо его разбора ($parse), но я не мог заставить его работать по какой-либо причине.

Ответ 2

Я использую его в ng-repeat, так что это улучшенный код для циклов и под-объектов:

Шаблон:

<div class="col-xs6 col-sm-5 col-md-4 col-lg-3" ng-repeat="box in boxes">
<div ng-include src="'/assets/js/view/box_campaign.html'" ng-dynamic-controller="box.type"></div>
</div>

Директива

mainApp.directive('ngDynamicController', ['$compile', '$parse',function($compile, $parse) {
  return {
      scope: {
          name: '=ngDynamicController'
      },
      restrict: 'A',
      terminal: true,
      priority: 100000,
      link: function(scope, elem, attrs) {
          elem.attr('ng-controller', scope.name);
          elem.removeAttr('ng-dynamic-controller');

          $compile(elem)(scope);
      }
  };
}]);

Ответ 3

Лично 2 текущих решения здесь не сработали для меня, так как имя контроллера не будет известно при первой компиляции элемента, но позже в течение другого цикла дайджеста. Поэтому я закончил использование:

myapp.directive('dynamicController', ['$controller', function($controller) {
  return {
    restrict: 'A',
    scope: true,
    link: function(scope, elem, attrs) {
      attrs.$observe('dynamicController', function(name) {
        if (name) {
          elem.data('$Controller', $controller(name, {
            $scope: scope,
            $element: elem,
            $attrs: attrs
          }));
        }
      });
    }
  };
}]);