为什么我无法注入角度曲奇?

时间:2013-03-12 09:55:14

标签: javascript angularjs angular-cookies

我有

<body ng-app="myApp">
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.min.js"></script>
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular-cookies.min.js">
    </script>
</body>

一切都正确加载。

然后在我的javascript中尝试注入ngCookies:

angular.module("myApp", ["ngCookies"]).
    config(function($cookies) {
         console.log($cookies.myCookie);
    });

但它似乎找不到$ cookies:

 Unknown provider: $cookies from myApp

6 个答案:

答案 0 :(得分:28)

我不确定你的功能用例是什么,但是你不能在配置块中注入服务($cookies是服务)。只能在配置块中注入常量和提供者。

您可以将服务注入运行块但我不知道这是否对您有所帮助,因为我不确定您尝试使用这些cookie做什么。

BTW:您似乎混合了主角度文件和ngCookies模块的版本。这与你的问题没有直接关系,但这很奇怪。

答案 1 :(得分:11)

您可以手动注射:

myApp.config(function() {
  var $cookies;
  angular.injector(['ngCookies']).invoke(['$cookies', function(_$cookies_) {
    $cookies = _$cookies_;
  }]);

  // here you can use $cookies as usual
});

您可能想知道为什么我们必须将ngCookies injector()指定为.invoke()来电?

ngCookies是模块的名称(您的项目中需要angular-cookies.js才能使用此模块)。通过调用injector()创建注入器时,您可以指定应使用哪些模块,以便可以使用这些模块中的服务。

invoke()调用一个函数,但是让你指定应该将哪些服务(由各种模块提供)传递给函数(在我们的例子中,由ngCookies模块提供的服务命名为{{ 1}})

这个解决方案有点像黑客,因为你手动创建新的注入器,与你的角度应用程序自动创建和使用的注入器分开,但它应该是安全的,因为$cookies似乎只使用的功能不保持自己状态的角度,只是浏览器功能的薄包装。

答案 2 :(得分:2)

我遇到了同样的问题。 角度版本和角度曲奇版本没有匹配。 我做了什么修复它是将bower.json更新为两者的工作版本。

"angular": ">=1.2.*",
"angular-cookies": ">=1.2.*"

然后我跑了:

bower install

我有这个问题:

Unable to find a suitable version for angular, please choose one:
1) angular#1.3.13 which resolved to 1.3.13 and is required by angular-cookies#1.3.13 
2) angular#>=1.2.x <=1.4.x which resolved to 1.3.16 and is required by oclazyload#1.0.1 
3) angular#1.4.0 which resolved to 1.4.0 and is required by angular-cookies#1.4.0 
4) angular#>=1.2.* which resolved to 1.4.0 and is required by hashve 
5) angular#>=1 which resolved to 1.4.0 and is required by angular-bootstrap#0.11.2 
6) angular#>=1.2.26 <=1.5 which resolved to 1.4.0 and is required by angular-translate#2.7.2 
7) angular#~1.x which resolved to 1.4.0 and is required by restangular#1.5.1 
8) angular#^1.2.6 which resolved to 1.4.0 and is required by angular-socket-io#0.6.1 
9) angular#>= 1.0.8 which resolved to 1.4.0 and is required by angular-ui-router#0.2.15 
10) angular#>=1.2.0 <1.5.0 which resolved to 1.4.0 and is required by angular-moment#0.10.1Prefix the choice with ! to persist it to bower.json

然后我选择了3。

并且有效。

答案 3 :(得分:0)

https://stackoverflow.com/a/18971123/132374开始,您似乎需要在服务模块中删除'ngCookies',如果您还没有:

var serviceModule = angular.app('App.services', ['ngCookies']);

这对我有用。请记住,$cookies仅适用于Angular允许您注入服务的地方(有关详细信息,请参阅接受的答案)。

答案 4 :(得分:0)

与其他人一样,您不能使用角度cookie服务。但是,没有人知道法律说你不能简单地使用document.cookie来访问它并自己解析它。或者,您可以创建自己的提供程序,使您可以访问cookie,并可以注入。请记住,angular只是一个框架,当框架有限制时,你必须记住使用一个叫做javascript的东西。

答案 5 :(得分:-11)

您应该使用名称$cookieProvider注入$cookies

angular.module("MyApp", ["ngCookies","ngRoute"])
    .config(["$routeProvider", "$locationProvider","$cookiesProvider",
        function($routeProvider, $locationProvider, $cookies) {

        }
    ]);