Який спосіб AngularJS отримати доступ до файлів cookie? Я бачив посилання як на службу, так і на модуль cookie, але прикладів не було.
Є чи не існує канонічного підходу AngularJS?
Який спосіб AngularJS отримати доступ до файлів cookie? Я бачив посилання як на службу, так і на модуль cookie, але прикладів не було.
Є чи не існує канонічного підходу AngularJS?
Відповіді:
Цю відповідь було оновлено, щоб відобразити останню стабільну версію angularjs. Важлива примітка - $cookieStore
це оточення тонкої обгортки $cookies
. Вони майже однакові тим, що працюють лише з файлами cookie сеансу. Хоча це відповідає на початкове запитання, є й інші рішення, які ви можете розглянути, як-от використання локального сховища або плагіна jquery.cookie (який би надав вам більш тонкий контроль і виконання файлів cookie на сервері. Звичайно, це робити в angularjs означає, що ви ймовірно, хотіли б перетворити їх у службу та використовувати $scope.apply
для сповіщення про зміни у моделях (у деяких випадках)
Ще одна примітка, і це те, що між витягненням даних є незначна різниця між ними, залежно від того, чи використовували ви $cookie
значення для зберігання або $cookieStore
. Звичайно, ви б дуже хотіли використовувати те чи інше.
Окрім додавання посилання на js-файл, вам потрібно ввести ngCookies
таке визначення програми, як:
angular.module('myApp', ['ngCookies']);
тоді вам слід добре піти.
Ось функціональний мінімальний приклад, де я показую, що cookieStore
це тонка обгортка навколо файлів cookie:
<!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>
Етапи:
angular.js
angular-cookies.js
ngCookies
в ваш модуль програми (і переконайтеся , що ви посилаєтеся на цей модуль в ng-app
атрибуті)$cookies
чи $cookieStore
контролера параметрcookieStore
за допомогою методів put / getОсь як можна встановити та отримати значення файлів 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");
Див. Документи для огляду API. Зауважте також, що послугу cookie було покращено деякими новими важливими функціями, такими як встановлення терміну дії (див. Цю відповідь ) та домену (див. Cookies Документи CookiesProvider ).
Зауважте, що у версії 1.3.x або нижче, файли cookie $ мають інший синтаксис, ніж вище:
$cookies.key = "value";
var value = $cookies.value;
Крім того, якщо ви використовуєте bower, переконайтеся, що правильно введіть назву пакета:
bower install angular-cookies@X.Y.Z
де XYZ - версія AngularJS, яку ви працюєте. Є ще один пакунок у "bogular cookie" (без "s"), який не є офіційним кутовим пакетом.
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 для його використання.
$cookieStore
до підпису свого контролера (тобто function AccountCtrl($scope, $cookieStore)
), але потім отримав таке повідомлення про помилку: Невідомий постачальник: $ cookieStoreProvider <- $ cookieStore
$cookieStore
мабуть, в основному призначені для створених клієнтом файлів cookie. Для доступу до файлів cookie, створених сервером, мені довелося використовувати $cookies
замість цього.
https://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular-cookies.min.js
) Дивіться повідомлення в блозі: blog.angularjs.org /
AngularJS надає модуль ngCookies та сервіс $ cookieStore для використання браузерних файлів cookie.
Для використання функції cookie нам потрібно додати файл angular-cookies.min.js.
Ось деякі методи куки AngularJS.
дістати (ключ); // Цей метод повертає значення заданого ключа cookie.
getObject (ключ); // Цей метод повертає деріаріалізоване значення заданого ключа cookie.
getAll (); // Цей метод повертає об'єкт ключового значення з усіма файлами cookie.
put (ключ, значення, [параметри]); // Цей метод встановлює значення для даного ключа cookie.
видалити (клавіша, [параметри]); // Цей метод видалення заданого файлу 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 .
Додайте кутову вкладку cookie: angular-cookies.js
Ви можете використовувати $ cookies або параметр $ cookieStore для відповідного контролера
Головний контролер додає цю ін'єкцію 'ngCookies':
angular.module("myApp", ['ngCookies']);
Використовуйте файли cookie у своєму контролері так:
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.cookie . Кілька місяців тому він був перейменований на js-cookie, а залежність jQuery видалена. Однією з причин була просто спрощення інтеграції з іншими рамками, такими як Angular.
Тепер, якщо ви хочете інтегрувати js-cookie з кутовим, це так просто, як щось на зразок:
module.factory( "cookies", function() {
return Cookies.noConflict();
});
І це все. Немає jQuery. Ні ngCookie.
Ви також можете створити спеціальні екземпляри для обробки певних файлів cookie на сервері, які записані по-різному. Візьмемо для прикладу PHP, який перетворює пробіли на стороні сервера в знак плюс,
+
а не кодує його у відсотках:
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/isissue/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");
};
}]);
})();