2017-04-21 110 views
0

我有一个控制器名称作为字符串,我想要它的构造函数。通过角度控制器名称访问控制器构造函数

我目前的方法如下使用$控制器:后来

$scope.myControllerConstructor= $controller("myControllerName" , {$scope: $scope.$new()}).constructor; 

,我用这种构造在这样的HTML:

<div ng-controller="myControllerConstructor"> 

的问题是我的控制器运行两个时间,有一次,当我得到的构造函数(这是错误的)和一次当我的HTML被编译(这是正确的)

问题是如何获得控制器构造函数,而不运行我T'


更新大约用例:在我们的应用中有60间%的相似性和40%不同的活动很多页。我为这些页面创建了一个指令,团队中的其他开发人员正在使用我的指令创建页面。

该指令接受一个模板和一个控制器(我让他们为字符串),后来包括我所提供的模板和控制器如下:

<div ng-include="myTemplate" ng-controller="myControllerConstructor"></div> 

请看一看this jsfiddle为一个简单的例子问题。

+0

方法没有多大意义。你试图解决什么更高水平的问题? – charlietfl

+0

如果您使用它来进行控制器继承,我会建议更新标题和问题以符合您的情况,这样可以更清楚并更容易地找到它。 – estus

+0

延迟安装API是私有的,并且不打算被应用程序使用。滥用AngularJS框架有很多方法。以非结构化的方式使用它通常会导致一个脆弱的应用程序,这是一个维护噩梦。那么你的用例是什么?也许有更好的结构化方式来实现它。 – georgeawg

回答

1

你的代码的结构看起来不错,但问题是$controller("myControllerName" , {$scope: $scope.$new()})已经实例化给你的给定范围的控制器。

确实,您可以通过.constructor访问控制器构造函数,但已经创建控制器的实例太晚了。

ng-controller做同样的事情作为$controller("myControllerName" , {$scope: $scope.$new()})

当控制器连接到经由NG-控制器 指令的DOM,AngularJS将实例化新的控制器对象,使用 指定控制器的构造函数。将创建一个新的子范围 ,并将其作为$ scope的 控制器构造函数的注入参数。

为了解决这个问题,你应该通过控制器构造函数pageDirectiveTemplate代替控制器名称。

working fiddle

+0

谢谢,它解决了这个问题。 – Arashsoft

0

有一种不同的方式可以实现这一点。在指令中,在使用独立作用域时(如你在小提琴上做的那样),你可以拥有一个属性controller,它的值为"@",另一个name属性的值为"myController"或任何你的控制器名称。

所以,你的指令可能是这个样子:

app.directive('pageDirective', function() { 
    return { 
    restrict: "A", 
    templateUrl: "pageDirectiveTemplate", 
    scope: { 
     myTemplate: "@" 
    }, 
    controller: "@", 
    name: "myController" 
    } 
}); 

注意,只有在HTML改变将有指令为属性而不是元素。所以,

<div page-directive my-template="templateA" my-controller="controllerA"> 
</div> 
<div page-directive my-template="templateA" my-controller="controllerB"> 
</div> 

这会给你正是你在找什么。现在你可以有相同的模板指向不同的控制器,反之亦然。

working fiddle |请注意,它适用于具有相同模板的两个不同控制器。另外,请检查控制台,看它是如何从每个控制器只记录一次。

+0

这很好,但问题是我们与“pageDirectiveTemplate”和“templateA”共享控制器。 pageDirectiveTemplate控制器是静态的并且具有共享逻辑。但是,myController是动态的。 – Arashsoft

+0

@Arashsoft,哦射击。所以让我清楚..你想分享一个动态控制器(说'controllerA')与一个静态('pageDirectiveTemplate')为一些动态模板。对? – tanmay

+0

“pageDirective”有自己的控制器和模板(它们是静态的)。在“pageDirectiveTemplate”里面,我想用动态控制器注入一个动态模板。目前我使用'

',它工作正常,但控制器运行两次。 – Arashsoft