我不知道为什么第一种状态有效,但第二种无效:

工作状态:

.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

08-20 03:48