这是工作 plunker的链接。
解决方案
我们需要 UI-Router 的两个特性:
- 解决(加载缺失的 js 代码)
- controllerProvider(请参阅以下文档中的引用)
angularAMD - main.js 定义
这将是我们的 main.js,其中包含智能转换控制器名称 - 控制器路径:
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";
});
});
应用程序.js
首先,我们需要一些方法将参数(例如 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,state(name, stateConfig)
我们可以使用controller
and controllerProvider
。从文档中提取的一些内容:
控制器提供者
...
controller
(可选)字符串函数
控制器 fn 应与新相关范围或已注册控制器的名称(如果作为字符串传递)相关联。可选地,可以在此处声明 ControllerAs。
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>
应注入控制器的可选依赖项。如果这些依赖项中的任何一个是 promises,则路由器将在实例化控制器之前等待它们全部解决...
即让我们使用controllerProvider
:
...动态解析控制器名称...
如果您设法到达这里,也许您想使用 RequireJS 检查另一个类似的解决方案 -带有 requirejs 的 angular-ui-router,控制器的延迟加载