javascript - 动态指定要在 Angular 指令中使用的 Controller

标签 javascript angularjs angularjs-directive angularjs-controller

我希望通过元素上的属性指定指令应使用的 Controller - 即动态:

HTML

<div data-mydirective data-ctrl="DynController"></div>

Angular

angular.module('app', [])
    .controller('MainController', [function() { ... }])

    .controller('DynController', [function() { ... }])

    .directive('mydirective', [function() {
        return {
            controller: 'DynController', // <- make this dynamic

            ...
        }
    }]);

最佳答案

您可以执行以下操作:

.directive('mydirective', [function() {
    return {        
        controller: function($scope, $element, $attrs){
              //Make decision based on attributes or $scope members
              if($scope.$attrs.caseA == 'true'){
                   return new ControllerA($scope, $element, $attrs);
               } else {
                   return new ControllerDefault($scope, $element, $attrs);
               }
         },
        ...
    }
}]);

更进一步,您可以使用 $controller

.directive('mydirective', ['$controller',function($controller) {
        return {   
            controller: function($scope, $element, $attrs){
                  return $controller($attrs.dynamicCtrlName, {$scope: $scope,$element:$element,$attrs:$attrs});
             },
             ...
        }
}

在这两种情况下,请确保提供 Controller 期望的所有特定可注入(inject)依赖项(特别是 $scope、$attrs、transclude 函数等...)。有关 Controller 注入(inject)的更多详细信息,请参见此处 $compile在 Controller 部分下 - 理想情况下,外部 Controller 功能应该接收它们作为本地传递的所有内容。

关于javascript - 动态指定要在 Angular 指令中使用的 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25685839/

相关文章:

javascript - AngularJS 动态表单字段添加必需属性

Javascript添加行,一个函数适用于不同的表

Angular 7 并且无法绑定(bind)到 'routerlink',因为它不是 'a' 的已知属性

javascript - 在JS中将datetime分别转换为日期和时间格式

angularjs - Angularjs 服务是单例的吗?

javascript - 如何使用 Angular 自动聚焦在第一个输入字段

javascript - 在 Angular 上编辑有序输入 ng-repeat 时避免回流

javascript - Angular JS 指令在 Visualforce(salesforce) 中不起作用?

angularjs - 检查 event.target 是否是 Angular 指令(元素)的子元素

javascript - 仅在需要时使用 jQuery 重新加载数据