Javascript 如何为路由动态设置控制器?
让我给出一个示例代码,以便更好地解释。下面是代码:Javascript 如何为路由动态设置控制器?,javascript,angularjs,controller,routes,Javascript,Angularjs,Controller,Routes,让我给出一个示例代码,以便更好地解释。下面是代码: $routeProvider .when("/b/:param",{ templateUrl:"main.html" controller:"MainCtrl" }) .when("/c/:param",{ templateUrl:"main.html" }); 现在,从上面的代码可以看到,对于一个路由,我指定了要分配给视图的控制器,而对于另一个路由,我没有添加控制器属性,因此对于该路由,页面上不会分配
$routeProvider
.when("/b/:param",{
templateUrl:"main.html"
controller:"MainCtrl"
})
.when("/c/:param",{
templateUrl:"main.html"
});
现在,从上面的代码可以看到,对于一个路由,我指定了要分配给视图的控制器,而对于另一个路由,我没有添加控制器属性,因此对于该路由,页面上不会分配任何控制器
现在我的问题是:
当我没有在路由中指定控制器属性时,是否有其他方法可以为该路由分配控制器
动态?
我试过的
- 我已经浏览了一些与此相关的SO页面,其中一个是-> 现在,我已经尝试了上面帖子中的一些解决方案,但这些解决方案对我不起作用。如果它们中的任何一个有效,请给我更多关于如何实现它们的信息 像在页面内设置控制器或使用ui路由器这样的解决方案不是我正在寻找的解决方案。所以请不要给出这样的答案
- 我尝试使用$controllerProvider&$controller、$routeProvider&$route提供的一些功能设置controller,但没有成功。我仍然不确定是否可以使用它们。如果可以,请回答如何使用它们
ngView
指令(其中之一)。它看起来是一个很好的地方<代码>ngView指令计数随时间从1到2变化,目标是最后一个
app.decorator('ngViewDirective', function ($delegate, $route, $injector) {
var ngViewHelper = $delegate[$delegate.length - 1];
var compile_ = ngViewHelper.compile || function () {};
var link_ = ngViewHelper.link;
var link = function () {
var current = $route.current;
if (current.controllerProvider) {
current.controller = $injector.invoke(current.controllerProvider);
}
link_.apply(null, arguments);
}
ngViewHelper.compile = function () {
compile_.apply(ngViewHelper, arguments);
return link;
};
return $delegate;
});
它为路线提供controllerProvider
参数,类似于(很抱歉)
controllerProvider
基本上是一个利用依赖注入的函数($route
和$routeParams
在这里肯定很受欢迎),并以字符串、构造函数或根本不使用控制器的形式返回控制器(未定义的
)
如果您提供了其他解决方案不适合您的要点原因,将会有所帮助。将防止走同一条路,或可能暴露使其工作的方法。还有,你说的是多少个动态控制器?如果只是使用
templateURL:function
的几个问题,我会简单地提到我尝试过的一些事情,以便其他查看我的问题的人会得到帮助,找到或记住我尝试过的问题是否有任何相关的解决方案。我不认为完全提及我尝试过的每一个问题都是可能的,或者是一个很好的解决方法问一个问题。但提供一些约束条件会有帮助。我的意思是说,不在路由配置中指定它。我想,如果我说我想要某个控制器,那么当某个特定路由即将发生时,无论我想要设置哪个控制器,都会很清楚。关于我提到的帖子,我发现没有答案这个问题的解决方案,但他们给了我一些想法,我尝试了,但失败了。你能解释一下下面这行是什么意思吗:ngView指令计数随时间从1变为2,目标是1.4中的最后一个,只有第二个应该装饰。在1.2中有。好的。谢谢你的回复
...
.when("/:id", {
controllerProvider: function ($routeParams) {
var controller;
if ($routeParams.id == 'foo')
controller = 'FooController';
else if ($routeParams.id == 'bar')
controller = function ($scope) { ... };
return controller;
}
});