首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态NG-控制器名称

动态NG-控制器名称
EN

Stack Overflow用户
提问于 2014-07-15 23:28:47
回答 3查看 11.8K关注 0票数 30

我想根据我们加载的配置动态指定一个控制器。如下所示:

代码语言:javascript
复制
<div ng-controller="{{config.controllerNameString}}>
    ...
</div>

我如何在angular中做到这一点?我认为这会很容易,但我似乎可以找到一种方法来做到这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-25 08:02:03

您要做的是在调用任何其他指令之前运行另一个指令,从某个模型中获取控制器名称,删除新指令并添加ng-controller指令,然后重新编译元素。

它看起来像这样:

代码语言:javascript
复制
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);
    }
  };
}]);

然后,您可以在模板中使用它,如下所示:

代码语言:javascript
复制
<div dynamic-ctrl="'blankCtrl'">{{tyler}}</div>

使用这样的控制器:

代码语言:javascript
复制
global.controller('blankCtrl',['$scope',function(tyler){
    tyler.tyler = 'tyler';
    tyler.tyler = 'chameleon';
}]);

可能有一种方法可以插值dynamic-ctrl的值($interpolate),而不是解析它($parse),但由于某种原因,我无法让它工作。

票数 34
EN

Stack Overflow用户

发布于 2015-03-04 06:10:58

我在ng-repeat中使用了它,所以这是循环和子对象的改进代码:

模板:

代码语言:javascript
复制
<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>

指令:

代码语言:javascript
复制
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);
      }
  };
}]);
票数 5
EN

Stack Overflow用户

发布于 2016-10-24 16:53:27

就我个人而言,这里的两个当前解决方案对我来说不起作用,因为控制器的名称在第一次编译元素时是不知道的,但后来在另一个摘要周期中不知道。因此,我最终使用:

代码语言:javascript
复制
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
          }));
        }
      });
    }
  };
}]);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24762229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档