IT이야기

AngularJS 오류 : $ injector : unpr 알 수없는 공급자

cyworld 2021. 4. 24. 09:50
반응형

AngularJS 오류 : $ injector : unpr 알 수없는 공급자


공장 방법론에 대한 문서의 예를 따라 자체 서비스를 구축하려고합니다. 그러나 알 수없는 공급자 오류가 계속 발생하기 때문에 내가 잘못한 것 같습니다. 이것은 선언, 구성 및 공장 정의를 포함하여 내 앱의 코드입니다.

편집 이제 문제 해결을 돕기 위해 모든 파일을 추가했습니다.

편집 오류의 전체 세부 정보는 getSettingsProvider를 찾고 있지만 찾을 수 없기 때문에 getSettings와 관련된 것으로 보이는 문제 아래에 있습니다.

Error: [$injector:unpr] http://errors.angularjs.org/1.2.16/$injector/unpr?    p0=getSettingsProvider%20%3C-%20getSettings
    at Error (native)
    at http://localhost/sw/selfservice/bower_components/angular/angular.min.js:6:450
    at http://localhost/sw/selfservice/bower_components/angular/angular.min.js:35:431
    at Object.c [as get] (http://localhost/sw/selfservice/bower_components/angular/angular.min.js:34:13)
    at http://localhost/sw/selfservice/bower_components/angular/angular.min.js:35:499
    at c (http://localhost/sw/selfservice/bower_components/angular/angular.min.js:34:13)
    at d (http://localhost/sw/selfservice/bower_components/angular/angular.min.js:34:230)
    at Object.instantiate (http://localhost/sw/selfservice/bower_components/angular/angular.min.js:34:394)
    at http://localhost/sw/selfservice/bower_components/angular/angular.min.js:66:112
    at http://localhost/sw/selfservice/bower_components/angular/angular.min.js:53:14 angular.js:9778
(anonymous function) angular.js:9778
(anonymous function) angular.js:7216
h.$apply angular.js:12512
(anonymous function) angular.js:1382
d angular.js:3869
$b.c angular.js:1380
$b angular.js:1394
Wc angular.js:1307
(anonymous function) angular.js:21459
a angular.js:2509
(anonymous function) angular.js:2780
q angular.js:330
c



현재 내 앱에있는 모든 파일입니다.

app.JS

//Initialize angular module include route dependencies

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

app.config(function ($routeProvider) {
   $routeProvider
       .when('/', {
           templateUrl:"partials/login.html",
           controller:"login"
       });
});






app.factory('getSettings', ['$http', '$q', function($http, $q) {
    return function (type) {
        var q = $q.defer();
        $http.get('models/settings.json').success(function (data) {
            q.resolve(function() {
                var settings = jQuery.parseJSON(data);
                return settings[type];
            });
        });

        return q.promise;
    };
}]);

컨트롤러에서이 서비스를 사용하는 방법은 다음과 같습니다.

controller.JS

app.controller("globalControl", ['$scope','getSettings', function ($scope,getSettings) {
    var loadSettings = getSettings('global');
    loadSettings.then(function(val) {
        $scope.settings = val;
    });

}]);


app.controller("login", ['$scope', function ($scope) {

    return ""



}]);

directives.js

app.directive('watchResize', function(){
    return {
        restrict: 'M',
        link: function(scope, elem, attr) {
            scope.spacer = (window.innerWidth < 1025) ? '' : 'large-3';
            scope.button = (window.innerWidth < 1025) ? '' : 'large-6';
            angular.element(window).on('resize', function(){
                scope.$apply(function(){
                    scope.spacer = (window.innerWidth < 1025) ? '' : 'large-3';
                    scope.button = (window.innerWidth < 1025) ? '' : 'large-6';
                });
            });
        }
    };
});

그리고 관련이 있다면 여기에 HTML

<html class="no-js" lang="en" ng-app="selfservice" ng-controller="globalControl">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>{{settings.title}}</title>
     <link rel="stylesheet" href="css/app.css" />
    <script src="bower_components/modernizr/modernizr.js"></script>
      <script src="bower_components/angular/angular.min.js"></script>
       <script src="bower_components/angular-route/angular-route.min.js"></script>
       <script src="bower_components/jquery/dist/jquery.min.js"></script>
      <script src="js/app.js"></script>
      <script src="js/controllers.js"></script>
      <script src="js/directives.js"></script>
  </head>
  <body>
    <div id="template">
        <header id="header">
            <img src="{{settings.logo}}" alt="{{settings.logoDescription}}"/>
        </header>

        <div id="view">
            <ng-view></ng-view>
        </div>

    </div>

    <script src="bower_components/foundation/js/foundation.min.js"></script>
        <script>
        //initialize foundation
        $(document).foundation();

    </script>
  </body>
</html>

누군가 나를 올바른 방향으로 가리킬 수 있습니까? 나는 문서를 따르기 위해 최선을 다했으며 대부분의 관련 문제를 살펴보면 훨씬 더 깊이 있고 이해하기가 더 어렵습니다. 서비스를 만드는 것은 이번이 처음입니다.


각도 모듈을 올바르게 초기화해야합니다. app서비스를 삽입하려면 전역 개체 를 올바르게 정의하고 초기화해야합니다.

참조를 위해 아래 샘플 코드를 참조하십시오.

app.js

var app = angular.module('SampleApp',['ngRoute']); //You can inject the dependencies within the square bracket    

app.config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) {
  $routeProvider
    .when('/', {
      templateUrl:"partials/login.html",
      controller:"login"
    });

  $locationProvider
    .html5Mode(true);
}]);

app.factory('getSettings', ['$http', '$q', function($http, $q) {
  return {
    //Code edited to create a function as when you require service it returns object by default so you can't return function directly. That's what understand...
    getSetting: function (type) { 
      var q = $q.defer();
      $http.get('models/settings.json').success(function (data) {
        q.resolve(function() {
          var settings = jQuery.parseJSON(data);
          return settings[type];
        });
      });
      return q.promise;
    }
  }
}]);

app.controller("globalControl", ['$scope','getSettings', function ($scope,getSettings) {
  //Modified the function call for updated service
  var loadSettings = getSettings.getSetting('global');
  loadSettings.then(function(val) {
    $scope.settings = val;
  });
}]);

샘플 HTML 코드는 다음과 같아야합니다.

<!DOCTYPE html>
<html>
    <head lang="en">
        <title>Sample Application</title>
    </head>
    <body ng-app="SampleApp" ng-controller="globalControl">
        <div>
            Your UI elements go here
        </div>
        <script src="app.js"></script>
    </body>
</html>

컨트롤러는 HTML 태그가 아니라 body 태그에 바인딩됩니다. 또한 성능상의 이유로 따라야 할 표준 관행이므로 HTML 페이지 끝에 사용자 정의 스크립트를 포함 시키십시오.

이것이 기본적인 주입 문제를 해결하기를 바랍니다.


또한 페이지에 서비스 파일을 포함하지 못한 이유 중 하나입니다.

<script src="myservice.js"></script>

app.factory('getSettings', ['$http','$q' /*here!!!*/,function($http, $q) {

모든 종속성을 선언하거나 아무것도 선언하지 않고 $ q 선언하는 것을 잊었습니다.

편집하다:

controller.js : 로그인, ""를 반환하지 않음


이 오류는 실수로 $ scope를 공장에 주입 할 때도 나타납니다.

angular.module('m', [])
    .factory('util', function ($scope) { // <-- this '$scope' gives 'Unknown provider' when one attempts to inject 'util'
       // ...
    });

같은 문제를 해결하기 위해 몇 시간을 보냈습니다. 이것이 내가 한 방법입니다.

app.js :

var myApp = angular.module( 'myApp', ['ngRoute', 'ngResource', 'CustomServices'] );

CustomServices는 내가 만들고 services.js라는 별도의 파일에 배치 한 새 모듈입니다.

_Layout.cshtml :

<script src="~/Scripts/app.js"></script>
<script src="~/Scripts/services/services.js"></script>

services.js :

var app = angular.module('CustomServices', []); 
app.factory( 'GetPeopleList', ['$http', '$log','$q', function ( $http, $log, $q )
{
    //Your code here
}

app.js

myApp.controller( 'mainController', ['$scope', '$http', '$route', '$routeParams', '$location', 'GetPeopleList', function ( $scope, $http, $route, $routeParams, $location, GetPeopleList )

services.js 파일의 새 모듈에 서비스를 바인딩해야하며 물론 기본 앱 모듈 (app.js)을 만들 때 새 모듈을 사용해야하며 컨트롤러에서 서비스 사용을 선언해야합니다. 당신은 그것을 사용하고 싶습니다.


이 문제가 발생하고 ui.router와 html 템플릿에 내 컨트롤러가 포함되어 있음이 밝혀졌습니다.

.config(['$stateProvider',
  function($stateProvider) {
    $stateProvider.state('dashboard', {
      url: '/dashboard',
      templateUrl: 'dashboard/views/index.html',
      controller: 'DashboardController'
    });
  }
]);

<section data-ng-controller="DashboardController">

컨트롤러와 컨트롤러에서 호출되는 기능이있는 모듈과 컨트롤러를 모두 "포함"하십시오.

module(theModule);

@ user2310334 방금 시도한 매우 기본적인 예 :

HTML 파일

<!DOCTYPE html>
<html lang="en" ng-app="app">

<head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular.min.js" type="text/javascript"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.6/angular-route.min.js" type="text/javascript"></script>
    <script src="./app.js" type="text/javascript"></script>
</head>

<body>
    <div ng-controller="MailDetailCtrl">
    </div>
</body>
</html>

자바 스크립트 파일 :

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

myApp.factory('mailService' , function () {
return {
    getData : function(){
      var employees = [{name: 'John Doe', id: '1'},
        {name: 'Mary Homes', id: '2'},
        {name: 'Chris Karl', id: '3'}
      ];

      return employees;
    }
  };

});


myApp.controller('MailDetailCtrl',['$scope', 'mailService', function($scope, mailService) {
  alert(mailService.getData()[0].name);
}]);

그리고 작동합니다. 시도 해봐.


컨트롤러를 외부에app.config 로드해야합니다 . 다음 코드로 인해이 오류가 발생할 수 있습니다.

app.config(["$stateProvider", "$urlRouterProvider", function ($stateProvider, $urlRouterProvider) {
       var AuthCtrl = require('components/auth/AuthCtrl'); //NOTICE HERE
       $stateProvider.state('login',{
            url: "/users/login",
            templateUrl: require("components/auth/login.tpl.html"),
            controller: AuthCtrl // ERROR
        })
}))

이 오류를 수정하려면 AuthCtrl을 외부app.config 로 이동해야합니다 .

var AuthCtrl = require('components/auth/AuthCtrl'); //NOTICE HERE
app.config(["$stateProvider", "$urlRouterProvider", function ($stateProvider, $urlRouterProvider) {
       $stateProvider.state('login',{
            url: "/users/login",
            templateUrl: require("components/auth/login.tpl.html"),
            controller: AuthCtrl // WORK
        });
}))

제 경우에는 앱에 새 서비스 (파일)를 추가했습니다. 새 서비스는 기존 컨트롤러에 삽입됩니다. 기존 컨트롤러에 대한 새로운 서비스 종속성 주입을 놓치지 않았고 내 앱 모듈을 한 곳 이상 선언하지 않았습니다. 웹 앱을 다시 실행하고 브라우저 캐시 새 서비스 파일 코드로 재설정되지 않으면 동일한 예외가 발생 합니다. 브라우저 캐시에 대한 새 서비스 파일을 얻기 위해 브라우저를 새로 고 쳤는데 문제가 사라졌습니다.


검색 할 때 Google에 나타나는 첫 번째 Stackoverflow 질문이므로 Error: $injector:unpr Unknown Provider여기에 추가하겠습니다.

index.html에서 모듈 / 종속성이 필요한 후에로드되지 않는지 확인하십시오.

예를 들어 내 코드에서 다음 customFactory.factory.js과 같이 시작합니다.

angular
   .module("app.module1")
   .factory("customFactory", customFactory);

그러나 index.html은 다음과 같습니다.

    <script src="/src/client/app/customFactory.factory.js"></script>
    <script src="/src/client/app/module1.module.js"></script>

실제로 다음과 같은 모습이어야합니다.

    <script src="/src/client/app/module1.module.js"></script>
    <script src="/src/client/app/customFactory.factory.js"></script>

customFactory.factory.js일부로 선언 module1되었으므로 이전에로드해야합니다.customFactory


ui-router를 사용할 때 ng-controller를 어디에도 사용해서는 안됩니다. 컨트롤러는 적절한 상태가 활성화되면 ui-view에 대해 자동으로 인스턴스화됩니다.

참조 URL : https://stackoverflow.com/questions/23942356/angularjs-error-injectorunpr-unknown-provider

반응형