Javascript angularjs在解决懒散问题时抛出错误:[ng:areq],分别加载脚本和添加视图控制器
我不知道为什么第一种状态有效,但第二种状态无效:Javascript angularjs在解决懒散问题时抛出错误:[ng:areq],分别加载脚本和添加视图控制器,javascript,angularjs,firebase-authentication,angularfire,Javascript,Angularjs,Firebase Authentication,Angularfire,我不知道为什么第一种状态有效,但第二种状态无效: 工作状态: .state('app.pages.invoice', { url: '/invoice', templateUrl: "assets/views/pages_invoice.html", title: 'Invoice', resolve: { "currentAuth": ["Auth", function(Auth) {
工作状态:
.state('app.pages.invoice', {
url: '/invoice',
templateUrl: "assets/views/pages_invoice.html",
title: 'Invoice',
resolve: {
"currentAuth": ["Auth", function(Auth) {
return Auth.$requireSignIn();
}]
}
})
非工作状态,抛出错误:[ng:areq]
:
.state('app.form.validation', {
url: '/validation',
templateUrl: "assets/views/form_validation.html",
title: 'Form Validate',
resolve: loadSequence('validationCtrl')
})
// 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];
}
}]
};
}
validationCtrl&p1=未%20a取消操作%2C%20get%20未定义
.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')
})
// 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
元素再次集成到解析中如何通过resolve注入validationCtrl.js,并将currentAuth元素也添加到resolve中?
这是loadsequence函数:
.state('app.form.validation', {
url: '/validation',
templateUrl: "assets/views/form_validation.html",
title: 'Form Validate',
resolve: loadSequence('validationCtrl')
})
// 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];
}
}]
};
}
更新2:
基本上,问题是只允许当前登录的用户查看应用程序的子页面。
;所以我的父视图是这样的:所以基本上我希望将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:
换言之,我在这里提出了这个问题,并试图找到多个解析状态的答案
编辑2:
下面是main.js:以及validationCtrl.js。
实际上,validationCtrl只是我拥有的其他控制器中的一个示例控制器
问题是如何阻止子视图的查看权限,除非解决了父级currentAuth?考虑到我不知道如何使用loadsequence和单例工厂处理多个解析。首先出现错误 错误:[ng:areq]: validationCtrl&p1=未%20a取消操作%2C%20get%20未定义 这意味着没有validationCtrl函数 我可能错了,但我认为您的控制器
控制器中的这一行有一个小错误:“validationCtrl”
,请根据**主控制器**
控制器:“validationCtrl”
就是
发生此错误的原因是,在包含不同参数的不同文件中定义了两个同名的angular.modules
,因为您可能试图实现依赖性
注入
这会导致问题,因为加载到主html文件中的脚本不知道要配置哪个angular.module
要解决此问题,请使用不同的名称定义angular.modules
如何阻止子视图的查看权限,除非父级currentAuth已解析
您可以安装此软件包此中间件
软件包包含一些预定义的
路由函数,或者您也可以创建自己的函数。除了此$documentation,还可以使用success和callback函数,您可以在使用singleton
工厂的同时创建自己的中间件
和auth
服务
或
假设您使用node.js
作为后端
,您可以使用在服务器中使用[中间件][3]
路由,并将其映射到前端路由
是nodejs中中间件身份验证的完美教程假设您使用的是ui路由器作为SPA应用程序的路由框架 错误:[ng:areq] 您得到的错误是: validationCtrl&p1=未%20a取消操作%2C%20get%20未定义 由于状态中的控制器声明,控制器函数的名称未解析,因为“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}:
如果为字符串,则它是服务的别名。
否则,如果为函数,则注入该函数,并将返回值视为依赖项。如果结果是一个承诺,则在实例化控制器并将其值注入控制器之前对其进行解析
有关更多详细信息,请参阅。如我在评论中所述,我建议您尝试以下方法:
.state('app.form.validation', {
url: '/validation',
templateUrl: "assets/views/form_validation.html",
title: 'Form Validate',
controller: "validationCtrl",
resolve:{
"myCtrl": loadSequence('validationCtrl'),
"currentAuth": ["Auth", function(Auth) {
return Auth.$requireSignIn();
}]
}
})
.state('app', {
// all states require logging by default
resolve:{
"currentAuth": ["Auth", function(Auth) {
return Auth.$requireSignIn();
// i'm guessing we're redirecting toward app.login if not logged
}]
}
})
.state('app.login', {
resolve:{
"currentAuth": ["Auth", function(Auth) {
return true;// just be sure to not do infinite redirections
}]
}
})
我评论的另一部分是关于一个事实,即儿童可以超越它
因此,您可以只执行以下操作:
.state('app.form.validation', {
url: '/validation',
templateUrl: "assets/views/form_validation.html",
title: 'Form Validate',
controller: "validationCtrl",
resolve:{
"myCtrl": loadSequence('validationCtrl'),
"currentAuth": ["Auth", function(Auth) {
return Auth.$requireSignIn();
}]
}
})
.state('app', {
// all states require logging by default
resolve:{
"currentAuth": ["Auth", function(Auth) {
return Auth.$requireSignIn();
// i'm guessing we're redirecting toward app.login if not logged
}]
}
})
.state('app.login', {
resolve:{
"currentAuth": ["Auth", function(Auth) {
return true;// just be sure to not do infinite redirections
}]
}
})
注意:如果您遇到一些问题,因为Auth尚未使用延迟加载加载,您应该能够以
角度加载它。运行您在控制器中定义了CurrentAuth吗?您遇到了什么样的错误?@ObasiObenyOj正如文档所说,我只需要将其放入控制器和函数中,就这样,好吗?我可以查看您的完整validationCtrl.js和mainapp.js文件吗?@pritishvaidya我添加了一个带有pastebin链接的更新。谢谢,我会尽力:)这不是我想要的答案。我已经有了护照,但我不再使用了。我只想使用firebase身份验证管理来管理视图。但由于我的视图是父/子视图,并且每个状态都有一个可用于loadsequence的解析,我不知道如何将firebase身份验证检查引入此链。因此,基本上,您只希望用户获得身份验证,然后路由到特定的路由,而不是其他路由?当我实现第二个问题嵌套解决方案的答案时,我得到了这个错误:我认为是因为我的另一个