AngularJS - 通过字符串获取 Controller 功能

标签 angularjs

我正在使用 ng-include指令将具有基于范围内某些变量的动态模板和 Controller 。目前我有一张这样的 map 。

$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 和 Controller 。以下返回 Controller 对象,但我需要返回该函数。
var ctrlObj = angular.module('moduleName').controller('ControllerName')

编辑 1

澄清:

However, I would like to discard this map and instead generate the templateUrl and controller via a string



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

最佳答案

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

  • 修改 ngInclude 指令,使其采用 src 表达式,解析它以获取 Controller 名称(模板 Foo.html => Controller FooCtrl)并在元素上设置 Controller ,就像在 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);
    
  • 创建新指令,例如"ajpaz-controller"监视 src 表达式并将 Controller 链接到元素,与第 1 点相同。明显的优点是它可以在不修改原始 ng-include 的情况下完成。它会像这样工作
    <div ng-include src="templateUrl" ajpaz-controller>
    

  • 所以你只需要在你的父 Controller 中保留当前的 ​​templateUrl。希望这是有道理的;)

    关于AngularJS - 通过字符串获取 Controller 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13707693/

    相关文章:

    html - 单击 md-menu、mdDialog 按钮时顶部导航向上移动

    angularjs - Fetch as Google 站长工具

    angularjs - Angular JS ng-view改变商店滚动位置

    javascript - 如何对齐输入组插件的宽度

    javascript - Angular ng-admin 未加载

    javascript - Angular ui 路由器 : Change state on double click

    javascript - Angular Directive(指令)中模板的路径?

    javascript - AngularJS 通过服务传递数据,但在页面刷新时丢失数据

    javascript - Angular JS 参数未定义

    javascript - Angular 翻译:过滤器忽略 namespace