4

我正在使用该ng-include指令,该指令将具有基于范围内某些变量的动态模板和控制器。目前我有一张这样的地图。

$scope.map = {
    'key1': {
        controller: Ctrl1,
        templateUrl: 'tmpl1.html'
 }, 
'key12': {
        controller: Ctrl2,
    templateUrl: 'tmpl1.html'
    }
}

...

<div ng-include src="map[key].templateUrl" ng-controller="map[key].controller"></div>

但是,我想丢弃这张地图,而是通过字符串生成 templateUrl 和控制器。以下返回控制器对象,但我需要返回函数。

var ctrlObj = angular.module('moduleName').controller('ControllerName')

编辑 1

澄清:

但是,我想丢弃这张地图,而是通过字符串生成 templateUrl 和控制器

基本上我会在页面上设置“子控制器”,以便它成为配置的约定。具有所有子控制器将共享的信息的主控制器:FooCtrl 将是“主”控制器,而 FooBarCtrl、FooBarSubCtrl 将是子控制器。我的目标是创建一个函数,将“Bar”解析为“FooBarCtrl”,并从中获取适当的控制器函数。

4

3 回答 3

2

我没有看到任何微不足道的方法来实现这一点,但是我可以想象两种潜在的解决方案:

  1. 修改 ngInclude 指令,使其接受 src 表达式,解析它以获取控制器名称(模板 Foo.html => 控制器 FooCtrl),并像在 ngView 中所做的那样在元素上设置控制器(https://github.com/ angular/angular.js/blob/master/src/ng/directive/ngView.js#L149):

    controller = $controller(current.controller, {$scope: lastScope});
    element.contents().data('$ngControllerController', controller);
    
  2. 创建新指令,例如“ajpaz-controller”,它监视 src 表达式并将控制器链接到元素,方法与第 1 点相同。明显的优点是它可以在不修改原始 ng-include 的情况下完成。它会像这样工作

    <div ng-include src="templateUrl" ajpaz-controller>
    

因此,您只需将当前的 templateUrl 保留在您的父控制器中。希望这是有道理的;)

于 2012-12-04T21:10:00.223 回答
1

我知道这个问题发布已经很久了,但是知道正确答案可能对其他人有用......

如果您通过正常方式注册,请使用 $controllerProvider:

app.controller('myController', function() {
    //blah, blah
});

您可以使用 $controller 服务来检索控制器功能,它就像一个 getter:

$controller('myController');

当然,不要忘记注入它... ;-)

于 2016-10-26T11:27:40.730 回答
0

从以下stackoverflow链接。我相信它有这个问题的答案。

使用由 angular.module().controller() 创建的 Angular 控制器

鉴于:

angular.module('App.controllers', [])
    .controller('home', function () {
        $scope.property = true;
    }]);

回答:

// Try using a string identifier.

routeProvider.when('/', {templateUrl: 'partials/home.html', controller: 'home'});
于 2013-03-29T20:03:58.933 回答