javascript - 从 AngularJS Controller 中,如何解析模块中定义的另一个 Controller 函数(动态 ng-controller)?

标签 javascript angularjs angularjs-scope angularjs-controller

不言自明的 fiddle :http://jsfiddle.net/5FG2n/6/

我需要根据字符串名称动态选择要在运行时使用的 Controller 。该字符串将从配置对象中读取。

在下面的代码中,我当前将 InnerCtrlAsLocalVariable 分配给 $scope.dynamicCtrl。如何将 InnerCtrlFromModule 分配给该属性?

查看:

<div ng-app='app' ng-controller='OuterCtrl'>
    <div ng-controller='dynamicCtrl'>
        {{message}}
    </div>
</div>

JS:

var InnerCtrlAsLocalVariable = ['$scope',
    function($scope) {
        $scope.message = 'from controller as local variable - do not want'
    }
];

angular.module('app', []) 

    .controller('OuterCtrl', ['$scope', 

        function($scope) {
            // Instead of doing this...
            $scope.dynamicCtrl = InnerCtrlAsLocalVariable;

            // ...I want to do something like this:
            // $scope.dynamicCtrl = resolveCtrl('InnerCtrlFromModule');                                               
        }
    ])

    .controller('InnerCtrlFromModule', ['$scope',
        function($scope) {
            $scope.message = 'from controller defined in module - want';
        }
    ]);

最佳答案

您可以尝试编写自定义指令:

.directive("ngDynamicController",function($compile){
        return {
            terminal: true, 
            priority: 1000,
            link:function(scope,element,attr){
                var controllerProperty = scope[attr.ngDynamicController];
                element.attr('ng-controller', controllerProperty);
                element.removeAttr("ng-dynamic-controller"); 
                $compile(element)(scope);
            }
        }
    })

如果您需要更多信息,为什么我们必须添加 terminal: truepriority: 1000。看看我对这个问题的回答:Add directives from directive in AngularJS

DEMO

您可以尝试将其作为值注入(inject):

angular.module('app', [])
        .value('InnerCtrl',InnerCtrlAsLocalVariable)
        .controller('OuterCtrl', ['$scope','InnerCtrl', 
        function($scope, InnerCtrl) { //inject the value into the function
            $scope.dynamicCtrl = InnerCtrl;                                          
        }
    ])

DEMO

或者使用$injector动态解析:

var InnerCtrlAsLocalVariable = ['$scope',
            function($scope) {
                $scope.message = 'from controller defined in module - want';
            }
        ]

    angular.module('app', [])
        .value('InnerCtrl',InnerCtrlAsLocalVariable)
        .controller('OuterCtrl', ['$scope','$injector', 
            function($scope, $injector) { //inject the $injector service.

                // resolve the value dynamically
                $scope.dynamicCtrl = $injector.get('InnerCtrl');

            }
        ])

        .controller('InnerCtrlFromModule', InnerCtrlAsLocalVariable)

DEMO

您可以使用$controller服务动态创建 Controller 实例,从该实例我们可以使用constructor属性检索构造函数

 angular.module('app', [])
        .controller('OuterCtrl', ['$scope','$controller', 
            function(scope, $controller) {

                scope.dynamicCtrl = $controller('InnerCtrlFromModule',{$scope:scope.$new()}).constructor;

            }
        ])

        .controller('InnerCtrlFromModule',['$scope', function($scope) {
                $scope.message = 'from controller defined in module - want';
            }])

DEMO

关于javascript - 从 AngularJS Controller 中,如何解析模块中定义的另一个 Controller 函数(动态 ng-controller)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21204371/

相关文章:

javascript - 使用 angular.element 通过 $ID 获取作用域对象

javascript - 从 AngularJS 中的 Controller 更新指令值

javascript - 如何为对象设置标志而不影响AngularJS中的其他$scope值?

javascript - &lt;script&gt;document.write ('<base href="' + document.location + '"/>');&lt;/script&gt;

javascript - 在完成循环之前,promise 得到解决

angularjs - ng-option 过滤保留选择第一个值

angularjs - 以 Angular 管理相关对象的最佳方法?

javascript - 单击 Google map 标记的 ajax 请求后加载 map

javascript - Bootstrap Accordion 菜单

javascript - 滚动时如何重叠html正文中的部分?