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身份验证检查引入此链。因此,基本上,您只希望用户获得身份验证,然后路由到特定的路由,而不是其他路由?当我实现第二个问题嵌套解决方案的答案时,我得到了这个错误:我认为是因为我的另一个