angularjs throws Ошибка: [ng: areq] при разрешении lazyloading скриптов и добавлении контроллера просмотра отдельно

Я не знаю, почему это первое состояние работает, а второе - нет:

Рабочее состояние:

.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 & р1 = не% 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')

то есть (контроллер перемещается в разрешение и нет . state ( 'app.form.validation' , { url : '/ validation' , templateUrl : "assets / views / form_validation.html" , title : 'Form Validate' , разрешить : loadSequence ( 'validationCtrl' ) }) больше):

currentAuth

и тогда я не знаю, как снова включить мой элемент в решение. Как я могу ввести validationCtrl.js через решение и добавить элемент currentAuth также в решение ?current// 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]; } }] }; }

вот функция последовательности погрузки:

    app.controller('ValidationCtrl', ["$scope", "$state", "$timeout", "SweetAlert", "$location",
        function ($scope, $state, $timeout, SweetAlert, $location) {
...


В моем первом состоянии нет контроллера, поэтому я прекрасно разбираюсь в currentAuth . Но когда в представлении есть контроллер, добавьте currentAuth, чтобы контроллер больше не работал.

заметка:

мой currentAuth взят отсюда .

Обновить:

herer - validationCtrl.js :

app.

обновление 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 })

.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();
        }]
    }


})

изменить 1:

Я поставил вопрос других слов , как хорошо здесь и пытаюсь найти ответ на несколько государств решить.

изменить 2:

здесь main.js: пастебиновый url

и URL-адрес validationCtrl.js pastebin .
Фактически, validationCtrl - это просто пример контроллера среди других контроллеров, которые у меня есть.
Вопрос заключается в том, как заблокировать разрешение просмотра для дочерних представлений, если не разрешен родительский currentAuth? учитывая, что я не знаю, как обрабатывать множественные решения с помощью loadsequence и $ stateProvider . state ( 'app' , { url : "/ app" , templateUrl : "assets / views / app.html" , разрешить : { scripts : loadSequence ( 'modernizr' , 'moment' , 'angleularMoment' , '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 станет «/ app / invoice» url : '/ invoice' , templateUrl : «assets / views / pages_invoice.html» , название : «Invoice» }) . state ( 'app.form.validation' , { controller : "ValidationCtrl" , // url станет '/ app / validation' url : '/ validation' , templateUrl : "assets / views / form_validation.html" , title : ' Form Validate ' }) .

javascript,angularjs,firebase-authentication,angularfire,

1

Ответов: 3


2 принят
+200

Предполагая, что вы используете ui router в качестве структуры маршрутизации для вашего SPA-приложения.

Ошибка: [of: areq]

ошибка, которую вы получаете:

validationCtrl & р1 = не% 20aNaNunction% 2C% 20got% 20undefined

связано с объявлением контроллера в состоянии, имя функции контроллера не разрешено, потому что «ValidationCtrl» не равно «validationCtrl», тогда правильное состояние:

.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
             }]
        }
    })

Как видно из примера в разрешении абстрактного состояния, вы можете определить различные заводские функции, ui router будет ждать, пока все зависимости не будут решены до разрешения состояний детей.

Разрешить объяснение свойства:

Свойство resolve является объектом карты. Объект карты содержит пары ключ / значение:

key a € "{string}: имя зависимости, которое должно быть введено в контроллер.

factory - {string | function}: Если строка, то это псевдоним для службы. В противном случае, если функция, то она вводится, а возвращаемое значение рассматривается как зависимость. Если результат является обещанием, он разрешается до создания экземпляра контроллера и его значение вводится в контроллер.

для более подробной информации я отсылаю вас к ui router doc .


1

Как сказано в моем комментарии, я предлагаю вам попробовать следующее:

angular.run

Другая часть моего комментария касалась того факта, что дочерние состояния наследуют решение родителя, и дети могут переопределить его.

Поэтому вы можете просто сделать следующее:

controller: "validationCtrl", change it according to the main controller
that is

Обратите внимание, если у вас есть проблемы, потому что Auth еще не загружен ленивой загрузкой, вы можете загрузить его в a controller: "validationCtrl".


0

Во-первых, придя к ошибке

Ошибка: [ng: areq]: validationCtrl & p1 = not% 20aNaNunction% 2C% 20got% 20undefined

**main controller**

Это означает, что нет функции validationCtrl.

Возможно, я ошибаюсь, но я думаю, что в этой строке вашего контроллера есть небольшая опечатка controller: "ValidationCtrl", измените ее в соответствии с тем, angular.modules dependancy что есть

Эта ошибка возникает из-за либо определения двух middlewareс тем же именем в разных файлах, содержащих разные аргументы, поскольку вы, возможно, пытаетесь реализовать pre-definedинъекцию.

Это вызывает проблему, так как скрипт, загруженный в ваш основной файл html, не будет знать, какой параметр angular.module будет настроен.

Чтобы решить эту проблему, определите угловые модули с разными именами.

Как заблокировать разрешение просмотра для дочерних представлений, если не разрешен родительский currentAuth

Вы можете установить этот пакет угловой auth. Этот middlewareпакет содержит некоторые singleton функции маршрута или вы также можете создавать свои собственные функции. Помимо этой документации в формате $ http, использующей функции успеха и обратного вызова, вы можете создать свою собственную middlewareи authслужбу при использовании singletonфабрики

ИЛИ

Предполагая, что вы используете в node.jsкачестве своего, backendвы можете использовать [middleware][3]маршрутизацию на своем сервере с помощью экспресс и сопоставить его с внешними маршрутами.

Вот идеальный учебник для проверки промежуточного ПО в nodejs

JavaScript, angularjs, firebase-аутентификации, angularfire,
Похожие вопросы