如何为路由动态设置控制器?
How to set controller dynamically for a route?
让我给出一个示例代码来更好地解释。下面是代码:
$routeProvider
.when("/b/:param",{
templateUrl:"main.html"
controller:"MainCtrl"
})
.when("/c/:param",{
templateUrl:"main.html"
});
现在从上面的代码中您可以看到,对于一条路线,我已经指定了要分配给视图的控制器,而对于另一条路线,我没有添加控制器 属性 所以对于那条路线页面上不会分配任何控制器。
Now my question :
When I don't specify the controller property in the route is there any other way that I can assign the controller for that route
dynamically?
我试过的
我浏览了一些与此相关的 SO 页面,其中之一是 -> dynamically loading the controller in angularjs $routeProvider
现在我已经尝试了上面 post 中的一些解决方案,但对我不起作用。如果其中任何一个有效,请给我更多关于如何实施它们的信息。
在页面内设置控制器或使用 ui-router 等解决方案不是我正在寻找的解决方案类型。所以请不要给出这样的答案。
我尝试使用通过 $controllerProvider 和 $controller 、 $routeProvider 和 $route 提供的一些功能来设置控制器,但没有成功。我仍然不确定是否可以使用它们如果有任务请回答如何使用它们。
如果问题仍然不清楚,请在此问题下方添加评论。谢谢。
Apparently,是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
参数,类似于the one from ui-router(抱歉)。
controllerProvider
基本上是一个利用依赖注入的函数($route
和 $routeParams
在那里肯定是受欢迎的)和 returns 作为字符串的控制器,一个构造函数,或者根本没有控制器 (undefined
)。
...
.when("/:id", {
controllerProvider: function ($routeParams) {
var controller;
if ($routeParams.id == 'foo')
controller = 'FooController';
else if ($routeParams.id == 'bar')
controller = function ($scope) { ... };
return controller;
}
});
让我给出一个示例代码来更好地解释。下面是代码:
$routeProvider
.when("/b/:param",{
templateUrl:"main.html"
controller:"MainCtrl"
})
.when("/c/:param",{
templateUrl:"main.html"
});
现在从上面的代码中您可以看到,对于一条路线,我已经指定了要分配给视图的控制器,而对于另一条路线,我没有添加控制器 属性 所以对于那条路线页面上不会分配任何控制器。
Now my question :
When I don't specify the controller property in the route is there any other way that I can assign the controller for that route dynamically?
我试过的
我浏览了一些与此相关的 SO 页面,其中之一是 -> dynamically loading the controller in angularjs $routeProvider
现在我已经尝试了上面 post 中的一些解决方案,但对我不起作用。如果其中任何一个有效,请给我更多关于如何实施它们的信息。
在页面内设置控制器或使用 ui-router 等解决方案不是我正在寻找的解决方案类型。所以请不要给出这样的答案。
我尝试使用通过 $controllerProvider 和 $controller 、 $routeProvider 和 $route 提供的一些功能来设置控制器,但没有成功。我仍然不确定是否可以使用它们如果有任务请回答如何使用它们。
如果问题仍然不清楚,请在此问题下方添加评论。谢谢。
Apparently,是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
参数,类似于the one from ui-router(抱歉)。
controllerProvider
基本上是一个利用依赖注入的函数($route
和 $routeParams
在那里肯定是受欢迎的)和 returns 作为字符串的控制器,一个构造函数,或者根本没有控制器 (undefined
)。
...
.when("/:id", {
controllerProvider: function ($routeParams) {
var controller;
if ($routeParams.id == 'foo')
controller = 'FooController';
else if ($routeParams.id == 'bar')
controller = function ($scope) { ... };
return controller;
}
});