2013-06-27 32 views
2

如何设置ng-controller作为$scope的表达式?如何在AngularJS中动态注入控制器

按照documentation

ngController – {expression} – Name of a globally accessible constructor function or an expression that on the current scope evaluates to a constructor function.

但如何评价范围表达式作为控制器,控制器已经登记模块.controller

例如:

布局:

<div ng-controller="myExpr"></div> 

的JavaScript(定义控制器):

app.controller('myCtrl', ['$scope', '$timeout', function() { ... }]; 

的JavaScript(父范围):

$scope.myExpr = ...; 

什么应该在myExpr中通过表达式使用myCtrl作为控制器?

我试过$controller('myCtrl') ...没有工作...

附:如果控制器已通过全局可访问的函数定义..可以将其作为myExpr提供。但如果已经定义了该怎么办?

+0

'app.controller('myCtrl',[]]'返回一个结果,该结果可以被分配给一个变量并且可以被分配给范围表达式。也就是说,我不明白你为什么想要做这样的事情...... – callmekatootie

+0

如果你想在另一个控制器内部重用一个控制器的功能,你最好将你需要的东西重构成一个可以注入的服务在所有控制器中。 – Narretz

+0

我想使用相同的控制器,但它应该适用于不同的服务。 例如,我们有一个控制器,它内部我们发送请求到一些API端点(通过服务),但在其他视图内部 - 同样的事情,但端点是另一个.. – ValeriiVasin

回答

1

ng控制器接受的表达式有点奇怪。所以你可以通过写你的控制器略有不同(但请阅读下面为什么你可能不想)。

function myCtrl($scope) { 
    $scope.value = 'Stuff'; 
} 

这是一个控制器,在这种情况下会像正常一样工作。像这样的例子:http://jsbin.com/ubevel/2/edit

那么为什么不做呢?
首先,这不是从测试的角度定义事物的好方法。其次,这允许您在加载时动态地设置控制器,但它不会允许您在此之后进行更改。如果您在后更改了myExpr 的值,则页面已加载,控制器不会更改。

那该怎么办?
我强烈建议看看使用服务,而不是。为您的外部控制器提供一项服务,然后以与您现在尝试更换内部控制器的方式相同的方式更换服务,从而完成您的操作。因此,如下所示:http://jsbin.com/ubevel/5/edit

此服务可以即时换出,更改它将更改范围中可用的操作。

您也可以使用include,但这会导致重复的html。我个性很好,因为我反对重复使用两个不同类型的对象的HTML(迟早你想改变一个而不是另一个,它变成一团糟)。但很多人会反对这一点。



一个额外注:可能有更好的方法与控制器做到这一点,我可能没有看过所有的角度,但我不认为控制器是针对这种情况的工具。

+0

好点。但这不是我真正想要的。我暂时用'ng-include'指令解决了这个问题,并且复制了我的'ng-repeat'项目的html代码。真正的问题是:如何将控制器的'ng-controller'指令用于'module.controller('ctrl',[/ ** dependencies * /]);'。 但是可以用两个答案作为实现目标的棘手方法。附:如果AngularJS具有此功能,并且这意味着作者允许我们在某些情况下执行此操作......甚至可能为了我的目标:) – ValeriiVasin

相关问题