我试图在我的应用程序中编写通用路由,并根据路由参数动态解析视图和控制器名称。
我有以下有效的代码:
$stateProvider.state('default', angularAMD.route({
url: '/:module/:action?id',
templateUrl: function (params) {
var module = params.module;
var action = module + params.action.charAt(0).toUpperCase()
+ params.action.substr(1);
return 'app/views/' + module + '/' + action + 'View.html';
},
controller: 'userController',
}));
但是,我无法找到一种动态解析控制器名称的方法。我尝试使用此处resolve
所述的方法,但是ui-
router似乎处理处理的方式与angular-
route不同。
有指针吗?
编辑
:我已经尝试使用,controllerProvider
但是对我不起作用(例如,以下代码仅返回一个硬编码的控制器名称,以测试其是否真正起作用):
controllerProvider: function () {
return 'userController';
}
给我以下错误:
错误:[ng:areq]参数’userController’不是函数,未定义
http://errors.angularjs.org/1.3.3/ng/areq?p0=userController&p1=not%20aNaNunction%2C%20got%20undefined
这是一个到工作的plnkr的链接。
我们需要UI路由器的两个功能:
这将是我们的main.js,其中包含智能转换controllerName-controllerPath:
require.config({
//baseUrl: "js/scripts",
baseUrl: "",
// alias libraries paths
paths: {
"angular": "angular",
"ui-router": "angular-ui-router",
"angularAMD": "angularAMD",
"DefaultCtrl": "Controller_Default",
"OtherCtrl": "Controller_Other",
},
shim: {
"angularAMD": ["angular"],
"ui-router": ["angular"],
},
deps: ['app']
});
// Controller_Default.js
define(['app'], function (app) {
app.controller('DefaultCtrl', function ($scope) {
$scope.title = "from default";
});
});
// Controller_Other.js
define(['app'], function (app) {
app.controller('OtherCtrl', function ($scope) {
$scope.title = "from other";
});
});
首先,我们需要一些将参数(例如id)转换为控制器名称的方法。出于测试目的,让我们使用这个简单的实现:
var controllerNameByParams = function($stateParams)
{
// naive example of dynamic controller name mining
// from incoming state params
var controller = "OtherCtrl";
if ($stateParams.id === 1) {
controller = "DefaultCtrl";
}
return controller;
}
.state()
这最终将是我们的州定义
$stateProvider
.state("default", angularAMD.route({
url: "/{id:int}",
templateProvider: function($stateParams)
{
if ($stateParams.id === 1)
{
return "<div>ONE - Hallo {{title}}</div>";
}
return "<div>TWO - Hallo {{title}}</div>";
},
resolve: {
loadController: ['$q', '$stateParams',
function ($q, $stateParams)
{
// get the controller name === here as a path to Controller_Name.js
// which is set in main.js path {}
var controllerName = controllerNameByParams($stateParams);
var deferred = $q.defer();
require([controllerName], function () { deferred.resolve(); });
return deferred.promise;
}]
},
controllerProvider: function ($stateParams)
{
// get the controller name === here as a dynamic controller Name
var controllerName = controllerNameByParams($stateParams);
return controllerName;
},
}));
在此工作示例中,请在此处检查
如此处所述:$ stateProvider,对于a state(name, stateConfig)
我们可以使用controller
和 controllerProvider
。文档摘录:
…
controller
(可选) stringfunction
如果作为字符串传递,则控制器fn应该与新相关的作用域或已注册控制器的名称相关联。可选地,可以在此处声明ControllerA。
controller: "MyRegisteredController"
controller:
"MyRegisteredController as fooCtrl"}
controller: function($scope, MyService) {
$scope.data = MyService.getData(); }
controllerProvider
(可选) 功能
返回实际控制器或字符串的可注入提供程序函数。
controllerProvider:
function(MyResolveData) {
if (MyResolveData.foo)
return "FooCtrl"
else if (MyResolveData.bar)
return "BarCtrl";
else return function($scope) {
$scope.baz = "Qux";
}
}
…
resolve
(可选) 对象
可选
map<string, function>
的依赖项,应将其注入到控制器中。 如果这些依赖项中的任何一个是promise ,则
路由器将 在实例化控制器之前 等待 它们 全部解决 。
即让我们使用 controllerProvider
:
…动态地解析控制器名称…
_如果您设法到达这里,也许您想使用RequireJS检查另一个类似的解决方案- 带有requirejs的angular-ui-router,延迟加载控制器
问题内容: 我正在建立一个带有角度UI路由器的静态HTML网站进行导航。我基本上有一个带有多个(10+)html模板(页面)的ui视图,可以加载到该视图中。我所有的模板页面都位于名为“页面”的目录中。 所以我基本上想知道我们是否可以在$ stateProvider中仅定义一个状态来动态分配多个模板url,而不是为每个HTML模板页面编写不同的状态(如下所述)。 任何帮助深表感谢。 问题答案: 那应
问题内容: 一个单例控制器是否可能具有多个视图 [https://github.com/angular-ui/ui- router/issues/494] ? 用例:我有一个ui-view = header和ui-view = content。我根据当前状态更改标题以显示上下文相关的按钮(即返回,保存,过滤等)。我希望这些按钮在内容控制器中调用一个函数,但是如果执行以下操作,它将创建两个MyCon
问题内容: 我有一个配置功能: InnerView位于mainView内部。当我获得url like时,函数按预期工作。但是,当我获得带有id的url时,即,我看不到任何输出,但是我希望输出,这就是我遇到的问题。我认为绝对/相对视图存在问题,但是我已经尝试了所有组合,但仍然无法正常工作。 更新: 所以现在我有以下状态: 正如RadimKöhler所说。输出,但是从现在开始我该如何到达? 问题答案:
问题内容: 是否可以基于路由组动态加载控制器,js文件和模板?伪代码不起作用: 我已经看到了很多这样的问题,但是没有一个问题基于路由组加载js文件/控制器。 问题答案: 我设法解决了受@ calebboyd,http : //ify.io/lazy-loading-in-angularjs/ 和http://weblogs.asp.net/dwahlin/archive/2013/05/22/dy
问题内容: 我想基于我们加载的配置动态指定一个控制器。像这样: 我该怎么做呢?我以为这很容易,但是我似乎可以找到一种方法。 问题答案: 您想要做的是在调用其他指令之前先运行另一个指令,从某个模型获取控制器名称,然后删除新指令并添加指令,然后重新编译元素。 看起来像这样: 然后,您可以在模板中使用它,如下所示: 使用这样的控制器: 可能有一种插值的值()而不是解析它()的方法,但是由于某种原因,我无
问题内容: 我正在尝试调用应该与 路线链接的控制器,但并未被调用。怎么了 问题答案: 好吧,我发现从给定的文件线索的的说 您可以为模板分配控制器。 警告: 如果未定义模板,则不会实例化控制器。 https://github.com/angular-ui/ui- router/wiki#controllers 但是我尝试添加,但仍然没有用,然后我发现我的父路由模板没有(我错误地删除了它),所以当我将