我不知道为什么第一种状态有效,但第二种无效:
工作状态:
.state('app.pages.invoice', {
url: '/invoice',
templateUrl: "assets/views/pages_invoice.html",
title: 'Invoice',
resolve: {
"currentAuth": ["Auth", function(Auth) {
return Auth.$requireSignIn();
}]
}
})
不工作状态,抛出
Error: [ng:areq]
:validationCtrl&p1 = not%20aNaNunction%2C%20got%20undefined
.state('app.form.validation', {
controller: "validationCtrl",
url: '/validation',
templateUrl: "assets/views/form_validation.html",
title: 'Form Validate',
resolve: {
"currentAuth": ["Auth", function(Auth) {
return Auth.$requireSignIn();
}]
}
})
仅当通过以下方式注入控制器时,第二个方法才有效:
resolve: loadSequence('validationCtrl')
即(将控制器移到解决方案中,并且不再有currentAuth了):
.state('app.form.validation', {
url: '/validation',
templateUrl: "assets/views/form_validation.html",
title: 'Form Validate',
resolve: loadSequence('validationCtrl')
})
然后我不知道如何将我的
currentAuth
元素再次集成到决心中。如何通过resolve注入validationCtrl.js,并将currentAuth元素也添加到resolve中?这是loadsequence函数:
// Generates a resolve object previously configured in constant.JS_REQUIRES (config.constant.js)
function loadSequence() {
var _args = arguments;
return {
deps: ['$ocLazyLoad', '$q',
function ($ocLL, $q) {
var promise = $q.when(1);
for (var i = 0, len = _args.length; i < len; i++) {
promise = promiseThen(_args[i]);
}
return promise;
function promiseThen(_arg) {
if (typeof _arg == 'function')
return promise.then(_arg);
else
return promise.then(function () {
var nowLoad = requiredData(_arg);
if (!nowLoad)
return $.error('Route resolve: Bad resource name [' + _arg + ']');
return $ocLL.load(nowLoad);
});
}
function requiredData(name) {
if (jsRequires.modules)
for (var m in jsRequires.modules)
if (jsRequires.modules[m].name && jsRequires.modules[m].name === name)
return jsRequires.modules[m];
return jsRequires.scripts && jsRequires.scripts[name];
}
}]
};
}
我的第一个状态没有任何控制器,因此我可以单独解决currentAuth。但是,当视图具有控制器时,添加currentAuth会导致控制器不再起作用。
注意:
我的currentAuth来自here。
更新:
继承人是validationCtrl.js:
app.controller('ValidationCtrl', ["$scope", "$state", "$timeout", "SweetAlert", "$location",
function ($scope, $state, $timeout, SweetAlert, $location) {
...
更新2:
基本上,问题是仅允许当前登录的用户查看
app.
子级的页面;所以我的父视图是这样的:因此,基本上,我希望将currentAuth工厂注入到主父视图中,并且子级应该继承此视图。除非解析了父级中的currentAuth,否则无法查看它们。$stateProvider.state('app', {
url: "/app",
templateUrl: "assets/views/app.html",
resolve: loadSequence('modernizr', 'moment', 'angularMoment', 'uiSwitch', 'perfect-scrollbar-plugin', 'toaster', 'ngAside', 'vAccordion', 'sweet-alert', 'chartjs', 'tc.chartjs', 'oitozero.ngSweetAlert', 'chatCtrl'),
abstract: true
})
编辑1:
我在这里用well来表示问题,并试图找到多个解决状态的答案。
编辑2:
这是main.js:pastebin url
和validationCtrl.js pastebin url。
实际上,validationCtrl只是我拥有的其他控制器中的一个示例控制器。
问题是如何解决子视图的视图权限,除非已解决父currentAuth?鉴于我不知道如何使用loadsequence和singleton工厂处理多重解析。
最佳答案
假设您将ui路由器用作SPA应用程序的路由框架。
错误:[ng:areq]
您得到的错误:
validationCtrl&p1 = not%20aNaNunction%2C%20got%20undefined
是由于状态内控制器的声明,控制器功能的名称未解析,因为“ ValidationCtrl”不等于“ validationCtrl”,那么正确的状态是:
.state('app.form.validation', {
controller: "ValidationCtrl",
url: '/validation',
templateUrl: "assets/views/form_validation.html",
title: 'Form Validate',
resolve: {
"currentAuth": ["Auth", function(Auth) {
return Auth.$requireSignIn();
}]
}
})
抽象状态-嵌套状态
为了回答第二个问题,针对您的案例的一个有用示例可能是:
$stateProvider.state('app', {
url: "/app",
templateUrl: "assets/views/app.html",
resolve: {
scripts: loadSequence('modernizr', 'moment', 'angularMoment', 'uiSwitch', 'perfect-scrollbar-plugin', 'toaster', 'ngAside', 'vAccordion', 'sweet-alert', 'chartjs', 'tc.chartjs', 'oitozero.ngSweetAlert', 'chatCtrl').deps,
currentAuth: function(Auth){ return Auth.$requireSignIn();}
},
abstract: true
})
.state('app.pages.invoice', {
// url will become '/app/invoice'
url: '/invoice',
templateUrl: "assets/views/pages_invoice.html",
title: 'Invoice'
})
.state('app.form.validation', {
controller: "ValidationCtrl",
// url will become '/app/validation'
url: '/validation',
templateUrl: "assets/views/form_validation.html",
title: 'Form Validate'
})
从示例中可以看出,您可以定义抽象工厂函数来定义抽象状态,ui路由器将等待直到所有依赖项都被解析后再解决子状态。
解决属性说明:
resolve属性是一个地图对象。映射对象包含以下项的键/值对:
key – {string}:要注入控制器的依赖项的名称。
工厂-{string | function}:
如果是字符串,则它是服务的别名。
否则,如果有函数,则将其注入,并将返回值视为依赖项。如果结果是承诺,则在实例化控制器并将其值注入控制器之前将其解析。
有关更多详细信息,请参考ui router doc。