web-dev-qa-db-ja.com

アンギュラーCookieを挿入できないのはなぜですか?

私が持っています

<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
28
Jeff Wong

あなたの機能的なユースケースは何なのかわかりませんが、サービスをインジェクトでき​​ません($cookiesはサービスです)configブロック内。構成ブロック内に挿入できるのは定数とプロバイダーのみです。

サービスを実行ブロックに挿入することはできますが、これらのCookieをどうしようとしているのかわからないので、これが役立つかどうかはわかりません。

ところで:あなたはメインのangularファイルとngCookiesモジュールのバージョンを混合しているようです。これはあなたの問題に直接リンクされていませんが、これはかなり奇妙です。

29

手動で注入できます:

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

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

injector()呼び出しと同様に.invoke()呼び出しにngCookiesを指定しなければならないのはなぜかと思うかもしれません。

ngCookiesはモジュールの名前です(このモジュールを使用するには、プロジェクトに angular-cookies.js が必要です)。 injector()を呼び出してインジェクターを作成する場合、使用するモジュールを指定して、それらのモジュールのサービスを使用できるようにします。

invoke()は関数を呼び出しますが、どのサービス(さまざまなモジュールによって提供される)を関数に渡すかを指定できます(この場合、ngCookiesモジュールによって提供されるサービスの名前は_$cookies_)

angularアプリが自動作成して使用するものとは別の新しいインジェクターを手動で作成するため、このソリューションはちょっとしたハックですが、ngCookie angularの機能のみを使用しているようです。これらの機能は、独自の状態を保持せず、ブラウザ機能の単なるラッパーです。

11
Kamil Szot

同じ問題が発生しました。 angular version and the angular cookiesバージョンが一致しませんでした。修正するために行ったのは、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を選択しました。

そしてそれは働いた。

2
shacharsol

他の誰もが述べたように、angular cookieサービスを使用することはできません。ただし、document.cookieを使用してアクセスし、自分で解析することはできないと言う法律はありません。 Cookieへのアクセスを提供する独自のプロバイダーを作成し、それを挿入できます。angularは単なるフレームワークであり、フレームワークに制限がある場合は、 javascript。

0
Pbrain19

https://stackoverflow.com/a/18971123/132374 から、まだお持ちでない場合は、サービスモジュールで「ngCookies」を削除する必要があるようです:

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

それは私のために働いた。それを念頭に置いて $cookiesは、Angularでサービスを注入できる場合にのみ機能します(詳細については、受け入れられた回答を参照してください)。

0
Jon Onstott