Подтвердить что ты не робот

Использование решения в $routeProvider вызывает "Неизвестный поставщик..."

СМОТРЕТЬ РЕШЕНИЕ В НОМЕРЕ ЭТОГО ПОЧТА

Я пытаюсь выполнить асинхронный HTTP-запрос для загрузки некоторых данных до загрузки приложения, поэтому я использую решение в $routeProvider, которое является HTTP-запросом в моем MainController. По какой-то причине я продолжаю получать Ошибка: [$ injector: unpr] Неизвестный поставщик: appDataProvider < - appData​​strong > , где appData - это место, где я выполняю свой HTTP-запрос. Я использую AngularJS v 1.2.5.

Вот код и два метода, которые я пробовал, оба они дают ту же ошибку:

Метод # 1

MainController.js

var MainController = ['$scope','$location','appData',
    function($scope, $location, appData){
       console.log(appData.data);
    }
];

MainController.loadData = {
    appData: function($http, $location, MainFactory){
        var aid = MainFactory.extractAid($location);
        return $http({method: 'GET', url: URL_CONST + aid});
    }
};

app.js

var app = angular.module('HAY', ['ngRoute']);

app.config(function($routeProvider) {
  $routeProvider
    .when('/', {
      redirectTo: '/pages/alerts'
    })
    .when('/pages/:pageName', {
        templateUrl: function(params) {
            return 'views/pages/' + params.pageName + '.html';
        },
        controller: MainController,
        resolve: MainController.loadData
    })
    .otherwise({
        redirectTo: '/pages/alerts'
    });
});

Я попытался изменить имя на случай, если это ключевое слово с конфликтующей системой, но без везения. По какой-то причине appData​​strong > никогда не распознается

Метод №2 Я также попытался изменить его так:

app.js

var app = angular.module('HEY', ['ngRoute']);

app.config(function($routeProvider) {
  $routeProvider
    .when('/', {
      redirectTo: '/pages/alerts'
    })
    .when('/pages/:pageName', {
        templateUrl: function(params) {
            return 'views/pages/' + params.pageName + '.html';
        },
        controller: MainController,
        resolve: {
                appData: ['$http', '$location','MainFactory', function($http, $location, MainFactory) {
                    var aid = MainFactory.extractAid($location);
                    return $http({method: 'GET', url: URL_CONST + aid});
                }]
        }
    })
    .otherwise({
        redirectTo: '/pages/alerts'
    });
});

MainController.js

var MainController = ['$scope','$location','appData',
    function($scope, $location, appData){
        console.log(resolvedData);
    }
];

Однако результат был точно таким же. Связано ли это с angular 1.2.5?

Вот рабочая версия от кого-то другого

http://mhevery.github.io/angular-phonecat/app/#/phones

И вот код:

function PhoneListCtrl($scope, phones) {
  $scope.phones = phones;
  $scope.orderProp = 'age';
}

PhoneListCtrl.resolve = {
  phones: function(Phone) {
    return Phone.query();
  },
  delay: function($q, $defer) {
    var delay = $q.defer();
    $defer(delay.resolve, 1000);
    return delay.promise;
  }
}

angular.module('phonecat', ['phonecatFilters', 'phonecatServices', 'phonecatDirectives']).
  config(['$routeProvider', function($routeProvider) {
    $routeProvider.
        when('/phones', {templateUrl: 'partials/phone-list.html', controller: PhoneListCtrl, resolve: PhoneListCtrl.resolve}).
        otherwise({redirectTo: '/phones'});
  }]);

РЕШЕНИЕ:

Проблема была НЕ из-за использования ранее используемой версии AngularJS.

Вот исправления с использованием кода, который у меня выше.

  • В app.js вам нужно объявить контроллер как контроллер : "MainController" и НЕ как контроллер: MainController даже хотя у вас есть var MainController = app.controller('MainController', ....).

  • Вторая и самая большая вещь в том, что в моем index.html я объявил свой контроллер уже такой:

    index.html

    body ng-app = "HEY" controller = "MainController" /body

    Это вызвало ошибку Неизвестного поставщика. По-видимому, angular не скажет вам, что вы уже заявили, что контроллер, который вы используете для разрешения, и что это приведет к странной ошибке, не имеют никакого отношения к решению.

Я надеюсь, что это поможет кому-то, у кого может быть такая же проблема.

4b9b3361

Ответ 1

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

Routing

.when('/view/proposal/:id',{
    controller : 'viewProposalCtrl',
    templateURL : 'tmpls/get/proposal/view',
    resolve : viewProposalCtrl.resolveViewProposal
})

контроллер

var viewProposalCtrl = angular.module('proposal.controllers')
    .controller('viewProposalCtrl',['$scope','contacts','details','rationale',
        function($scope,contacts,details,rationale){
            $scope.contacts = contacts;
            $scope.details = details;
            $scope.rationale = rationale;

            // [ REST OF CONTROLLER CODE ]
        });


// proposalSrv is a factory service

viewProposalCtrl.resolveViewProposal = {
    contacts : ['$route','proposalSrv',function($route,proposalSrv){
        return proposalSrv.get('Contacts',$route.current.params.id)
           .then(function(data){
               return data.data.contacts;
           },function(){
               return [];
           });
    }],
    details : ['$route','proposalSrv',function($route,proposalSrv){
        return proposalSrv.get('Details',$route.current.params.id)
            .then(function(data){
                return data.data.details;
            },function(){
                return {};
            });
    }],
    rationale : ['$route','proposalSrv',function($route,proposalSrv){
        return proposalSrv.get('Rationale',$route.current.params.id)
            .then(function(data){
                return data.data.rationale;
            },function(){
                return {};
            ]
    }]
};

Теперь, когда я размышлял над этим, когда я разрабатывал свое приложение, у меня была проблема, и я не уверен, почему, когда я назвал функцию разрешения "разрешить". Это дало мне проблему:

.when('/path',{
     // stuff here
     resolve : myCtrlr.resolve
})

но это не так:

.when('/path',{
     //stuff here
     resolve : myCtrlr.myResolveFn
})

Другая возможность

Единственное, что я могу придумать, это то, что вы возвращаете обещание из вызова $http, а затем пытаетесь использовать appData.data Попробуйте использовать функцию .then или одну других функций (.success, .error) для извлечения информации из обещания.

Ответ 2

Одна вещь, которую я заметил в angular 1x docs, состоит в том, что ВЫ НЕ УКАЗАНЫ РЕШЕННЫЙ ПАРАМЕТР КАК АННОТИРОВАННАЯ ЗАВИСИМОСТЬ

Итак, это:

.when('/somewhere', {
  template: '<some-component></some-component>',
  resolve: {
    resolvedFromRouter: () => someService.fetch()
  }
})

export default [
  '$scope',
  'someService',
  'resolvedFromRouter'
  Controller
]

function Controller($scope, someService, resolvedFromRouter) {
  // <= unknown provider "resolvedFromRouter"
}

неверно. Вы не указываете разрешенный параметр как зависимость, в документах:

Для облегчения доступа к разрешенным зависимостям из шаблона карта разрешений будет доступна в области маршрута под $разрешением (по умолчанию) или настраиваемым именем, указанным свойством resolveAs (см. ниже). Это может быть особенно полезно при работе с компонентами в качестве шаблонов маршрутов.

Так просто сделайте это вместо:

.when('/somewhere', {
  template: '<some-component></some-component>',
  resolve: {
    resolvedFromRouter: () => someService.fetch()
  }
})

export default [
  '$scope',
  'someService',
  Controller
]

function Controller($scope, someService) {
  $scope.$resolve.resolvedFromRouter; // <= injected here
}