Как получить доступ к cookies в AngularJS?

каков способ AngularJS для доступа к cookies? Я видел ссылки как на сервис, так и на модуль для cookies, но никаких примеров.

есть ли, или нет канонического подхода AngularJS?

9 ответов


этот ответ был обновлен, чтобы отразить последнюю стабильную версию angularjs. Важно отметить, что $cookieStore - это тонкая обертка вокруг $cookies. Они очень похожи в том, что они работают только с сеансовыми. Хотя это отвечает на исходный вопрос, есть и другие решения, которые вы можете рассмотреть, такие как использование localstorage или jquery.плагин cookie (который даст вам более мелкозернистый контроль и сделает файлы cookie на сервере. Конечно, делать это в angularjs означает вероятно, вы захотите обернуть их в сервис и использовать $scope.apply для уведомления угловых изменений в моделях (в некоторых случаях).

еще одна заметка, и это то, что есть небольшая разница между ними при извлечении данных в зависимости от того, если вы использовали $cookie сохранить значения или $cookieStore. Конечно, вы действительно хотите использовать один или другой.

в дополнение к добавлению ссылки на файл js вам нужно ввести ngCookies в ваше определение приложения, такое как:

angular.module('myApp', ['ngCookies']);

затем вы должны быть хорошо идти.

вот функциональный минимальный пример, где я показываю, что cookieStore - это тонкая обертка вокруг печенья:

<!DOCTYPE html>
<html ng-app="myApp">
<head>
   <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
</head>
<body ng-controller="MyController">

  <h3>Cookies</h3>
  <pre>{{usingCookies|json}}</pre>
  <h3>Cookie Store</h3>
  <pre>{{usingCookieStore|json}}</pre>

  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.js"></script>
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular-cookies.js"></script>
  <script>
    angular.module('myApp', ['ngCookies']);
    app.controller('MyController',['$scope','$cookies','$cookieStore', 
                       function($scope,$cookies,$cookieStore) {
      var someSessionObj = { 'innerObj' : 'somesessioncookievalue'};

    $cookies.dotobject = someSessionObj;
    $scope.usingCookies = { 'cookies.dotobject' : $cookies.dotobject, "cookieStore.get" : $cookieStore.get('dotobject') };

    $cookieStore.put('obj', someSessionObj);
    $scope.usingCookieStore = { "cookieStore.get" : $cookieStore.get('obj'), 'cookies.dotobject' : $cookies.obj, };
    }
  </script>

</body>
</html>

действия:

  1. включить angular.js
  2. включить angular-cookies.js
  3. inject ngCookies в ваш модуль приложения (и убедитесь, что вы ссылаетесь на этот модуль в )
  4. добавить $cookies или

вот как вы можете установить и получить значения cookie. Это то, что я изначально искал, когда нашел этот вопрос.

обратите внимание, мы используем $cookieStore вместо $cookies

<!DOCTYPE html>
<html ng-app="myApp">
<head>
  <script src="http://code.angularjs.org/1.0.0rc10/angular-1.0.0rc10.js"></script>
  <script src="http://code.angularjs.org/1.0.0rc10/angular-cookies-1.0.0rc10.js"></script>
  <script>
    angular.module('myApp', ['ngCookies']);
    function CookieCtrl($scope, $cookieStore) {
      $scope.lastVal = $cookieStore.get('tab');

      $scope.changeTab = function(tabName){
          $scope.lastVal = tabName;
          $cookieStore.put('tab', tabName);
      };
    }
  </script>
</head>
<body ng-controller="CookieCtrl">
    <!-- ... -->
</body>
</html>

Угловое устаревший $cookieStore в версии 1.4.x, поэтому используйте $cookies вместо этого, если вы используете последнюю версию угловой. Синтаксис остается неизменным для $cookieStore & $cookies:

$cookies.put("key", "value"); 
var value = $cookies.get("key");

посмотреть Docs для обзора API. Имейте также в виду, что сервис cookie был улучшен с помощью некоторых новых важных функций, таких как установка срока действия (см. ответ) и домен (см. CookiesProvider Docs).

обратите внимание, что, в версии 1.3.X или ниже, $cookies имеет другой синтаксис, чем выше:

$cookies.key = "value";
var value = $cookies.value; 

кроме того, если вы используете bower, убедитесь, что правильно введите имя пакета:

bower install angular-cookies@X.Y.Z 

где X. Y. Z-это версия AngularJS, которую вы используете. В bower есть еще один пакет "angular-cookie" (без "s"), который не является официальным пакетом angular.


FYI, я собрал JSFiddle этого, используя $cookieStore, два контроллера, a $rootScope, и AngularjS 1.0.6. Это на JSFifddle как http://jsfiddle.net/krimple/9dSb2/ в качестве базы, если вы возитесь с этим...

суть такова:

Javascript

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

myApp.controller('CookieCtrl', function ($scope, $rootScope, $cookieStore) {
    $scope.bump = function () {
        var lastVal = $cookieStore.get('lastValue');
        if (!lastVal) {
            $rootScope.lastVal = 1;
        } else {
            $rootScope.lastVal = lastVal + 1;
        }
        $cookieStore.put('lastValue', $rootScope.lastVal);
    }
});

myApp.controller('ShowerCtrl', function () {
});

HTML-код

<div ng-app="myApp">
    <div id="lastVal" ng-controller="ShowerCtrl">{{ lastVal }}</div>
    <div id="button-holder" ng-controller="CookieCtrl">
        <button ng-click="bump()">Bump!</button>
    </div>
</div>

http://docs.angularjs.org/api/ngCookies.$cookieStore

убедитесь, что вы включаете http://code.angularjs.org/1.0.0rc10/angular-cookies-1.0.0rc10.js использовать его.


AngularJS предоставляет модуль ngCookies и сервис $ cookieStore для использования файлов cookie браузера.

нам нужно добавить angular-cookies.минута.JS-файл для использования функции cookie.

вот некоторые методы AngularJS Cookie.

  • get (key); // этот метод возвращает значение данного ключа cookie.

  • getObject (key); / / этот метод возвращает десериализованное значение данного ключ cookie.

  • getAll (); / / это метод возвращает объект key value со всеми cookies.

  • put (key, value, [options]); / / этот метод устанавливает значение для данного ключ cookie.

  • remove (key, [options]); //этот метод удаляет данный файл cookie.

пример

HTML-код

<!DOCTYPE html>
<html ng-app="myApp">
<head>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.1/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.1/angular-cookies.min.js"></script>
</head>
<body ng-controller="MyController">
{{cookiesUserName}} loves {{cookietechnology}}.
</body>
</html>

JavaScript

var myApp = angular.module('myApp', ['ngCookies']);
myApp.controller('MyController', ['$scope', '$cookies', '$cookieStore', '$window', function($scope, $cookies, $cookieStore, $window) {
$cookies.userName = 'Max Joe';
$scope.cookiesUserName = $cookies.userName;
$cookieStore.put('technology', 'Web');
$scope.cookietechnology = $cookieStore.get('technology'); }]);

Я взял ссылку из http://www.tutsway.com/simple-example-of-cookie-in-angular-js.php.


добавить угловое печенье lib: угловое печенье.js

вы можете использовать параметр $ cookies или $cookieStore для соответствующего контроллера

главный регулятор добавляет Это впрыскивает 'ngCookies':

angular.module("myApp", ['ngCookies']);

используйте Cookies в вашем контроллере следующим образом:

 app.controller('checkoutCtrl', function ($scope, $rootScope, $http, $state, $cookies) { 

//store cookies

 $cookies.putObject('final_total_price', $rootScope.fn_pro_per);

//Get cookies

 $cookies.getObject('final_total_price'); }

оригинальный принятый ответ упоминает С помощью jQuery.плагин куки. Несколько месяцев назад он был переименован в Яш-печенье и зависимость jQuery удалена. Одна из причин заключалась в том, чтобы упростить интеграцию с другими фреймворками, такими как Angular.

теперь, если вы хотите интегрировать Яш-печенье с угловым, это так же просто, как что-то вроде:

module.factory( "cookies", function() {
  return Cookies.noConflict();
});

и это все. Нет в jQuery. Нет ngCookies.


вы также можете создавать пользовательские экземпляры для обработки определенных файлов cookie на стороне сервера, которые написаны по-разному. Возьмем для примера PHP, который преобразует пробелы in the server-side to a plus sign +, а также процентов-кодировать его:

module.factory( "phpCookies", function() {
  return Cookies
    .noConflict()
    .withConverter(function( value, name ) {
      return value
            // Decode all characters according to the "encodeURIComponent" spec
            .replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent)
            // Decode the plus sign to spaces
            .replace(/\+/g, ' ')
    });
});

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

module.service( "customDataStore", [ "phpCookies", function( phpCookies ) {
  this.storeData = function( data ) {
    phpCookies.set( "data", data );
  };
  this.containsStoredData = function() {
    return phpCookies.get( "data" );
  }
}]);

Я надеюсь, что это помогает любому.

посмотреть подробную информацию в этом вопросе: https://github.com/js-cookie/js-cookie/issues/103

подробные документы по интеграции с сервером см. здесь:https://github.com/js-cookie/js-cookie/blob/master/SERVER_SIDE.md


вот простой пример использования $ cookies. После нажатия на кнопку cookie сохраняется, а затем восстанавливается после перезагрузки страницы.

app.HTML-код:

<html ng-app="app">
<head>
    <meta charset="utf-8" />
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.3/angular.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.6.3/angular-cookies.js"></script>
    <script src="app.js"></script>
</head>
<body ng-controller="appController as vm">

    <input type="text" ng-model="vm.food" placeholder="Enter food" />

    <p>My favorite food is {{vm.food}}.</p>

    <p>Open new window, then press Back button.</p>
    <button ng-click="vm.openUrl()">Open</button>
</body>
</html>

app.js:

(function () {
    "use strict";

    angular.module('app', ['ngCookies'])
    .controller('appController', ['$cookies', '$window', function ($cookies, $window) {
        var vm = this;

        //get cookie
        vm.food = $cookies.get('myFavorite');

        vm.openUrl = function () {
            //save cookie
            $cookies.put('myFavorite', vm.food);
            $window.open("http://www.google.com", "_self");
        };
    }]);

})();