W jaki sposób AngularJS ma dostęp do plików cookie? Widziałem odniesienia do usługi i modułu do plików cookie, ale nie ma przykładów.
Czy istnieje, czy nie istnieje podejście kanoniczne AngularJS?
W jaki sposób AngularJS ma dostęp do plików cookie? Widziałem odniesienia do usługi i modułu do plików cookie, ale nie ma przykładów.
Czy istnieje, czy nie istnieje podejście kanoniczne AngularJS?
Odpowiedzi:
Ta odpowiedź została zaktualizowana, aby odzwierciedlić najnowszą stabilną wersję angularjs. Jedną ważną uwagą jest to, że $cookieStore
otoczka jest cienka $cookies
. Są prawie takie same, ponieważ działają tylko z sesyjnymi plikami cookie. Chociaż odpowiada to na pierwotne pytanie, istnieją inne rozwiązania, które warto rozważyć, takie jak użycie localstorage lub wtyczki jquery.cookie (co dałoby ci bardziej szczegółową kontrolę i robienie ciasteczek na serwerach. Oczywiście robiąc to w angularjs oznacza to, że prawdopodobnie chciałby zawinąć je w usługę i użyć $scope.apply
do powiadomienia kątowego o zmianach w modelach (w niektórych przypadkach).
Jeszcze jedna uwaga, a mianowicie, że istnieje niewielka różnica między nimi podczas wyciągania danych, w zależności od tego, czy użyłeś $cookie
do przechowywania wartości lub $cookieStore
. Oczywiście, naprawdę chcesz użyć jednego lub drugiego.
Oprócz dodania odwołania do pliku js musisz wprowadzić ngCookies
do definicji aplikacji, na przykład:
angular.module('myApp', ['ngCookies']);
powinieneś być gotowy do drogi.
Oto funkcjonalny minimalny przykład, w którym pokazuję, że cookieStore
jest to cienkie opakowanie wokół plików 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>
Kroki są następujące:
angular.js
angular-cookies.js
ngCookies
do modułu aplikacji (i upewnij się, że odwołujesz się do tego modułu w ng-app
atrybucie)$cookies
lub $cookieStore
do kontroleracookieStore
przy użyciu metod put / getW ten sposób można ustawić i uzyskać wartości plików cookie. Właśnie tego szukałem, kiedy znalazłem to pytanie.
Uwaga: używamy $cookieStore
zamiast$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>
Angular przestarzałe $cookieStore
w wersji 1.4.x, więc użyj go, $cookies
jeśli używasz najnowszej wersji angular. Składnia pozostaje taka sama dla $cookieStore
& $cookies
:
$cookies.put("key", "value");
var value = $cookies.get("key");
Omówienie interfejsu API można znaleźć w Dokumentach . Pamiętaj również, że usługa plików cookie została ulepszona o kilka nowych ważnych funkcji, takich jak ustawianie daty ważności (zobacz tę odpowiedź ) i domeny (patrz Dokumenty CookiesProvider ).
Pamiętaj, że w wersji 1.3.x lub niższej pliki cookie $ mają inną składnię niż wyżej:
$cookies.key = "value";
var value = $cookies.value;
Również jeśli używasz altany, upewnij się, że poprawnie wpisałeś nazwę swojej paczki:
bower install angular-cookies@X.Y.Z
gdzie XYZ jest uruchomioną wersją AngularJS. Jest jeszcze jeden pakiet w „angular-cookie” altany (bez „s”), który nie jest oficjalnym pakietem kątowym.
Do twojej wiadomości, JA przygotowałem JIDiddle tego, używając $cookieStore
dwóch kontrolerów, a $rootScope
i AngularjS 1.0.6. Jest na JSFifddle jako http://jsfiddle.net/krimple/9dSb2/ jako baza, jeśli masz do czynienia z tym ...
Jego istotą jest:
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
Upewnij się, że podałeś http://code.angularjs.org/1.0.0rc10/angular-cookies-1.0.0rc10.js, aby go użyć.
$cookieStore
do podpisu mojego kontrolera (tj. function AccountCtrl($scope, $cookieStore)
), Ale następnie otrzymałem następujący komunikat o błędzie: Nieznany dostawca: $ cookieStoreProvider <- $ cookieStore
$cookieStore
najwyraźniej jest przeznaczony głównie do plików cookie generowanych przez klientów. Aby uzyskać dostęp do plików cookie generowanych przez serwer, musiałem $cookies
zamiast tego użyć .
https://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular-cookies.min.js
) Zobacz wpis na blogu: blog.angularjs.org /
AngularJS zapewnia moduł ngCookies i usługę $ cookieStore do korzystania z plików cookie przeglądarki.
Musimy dodać plik angular-cookies.min.js, aby móc korzystać z funkcji plików cookie.
Oto niektóre metody AngularJS Cookie.
Weź klucz); // Ta metoda zwraca wartość podanego klucza cookie.
getObject (klucz); // Ta metoda zwraca zdejrializowaną wartość danego klucza cookie.
getAll (); // Ta metoda zwraca obiekt wartości klucza ze wszystkimi ciasteczkami.
put (klucz, wartość, [opcje]); // Ta metoda ustawia wartość dla danego klucza cookie.
usuń (klucz, [opcje]); // Ta metoda usuwa podane ciasteczko.
Przykład
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'); }]);
Wziąłem odniesienie z http://www.tutsway.com/simple-example-of-cookie-in-angular-js.php .
Dodaj plik cookie kątowy lib: angular-cookies.js
Możesz użyć parametru $ cookies lub $ cookieStore do odpowiedniego kontrolera
Główny kontroler dodaje nastrzyk „ngCookies”:
angular.module("myApp", ['ngCookies']);
Używaj plików cookie w kontrolerze w następujący sposób:
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'); }
Oryginalna zaakceptowana odpowiedź wspomina o wtyczce jquery.cookie . Kilka miesięcy temu zmieniono jego nazwę na js-cookie i usunięto zależność jQuery. Jednym z powodów było po prostu ułatwienie integracji z innymi frameworkami, takimi jak Angular.
Teraz, jeśli chcesz zintegrować plik cookie js z aplikacją kątową, jest to tak proste jak:
module.factory( "cookies", function() {
return Cookies.noConflict();
});
I to wszystko. Brak jQuery. Brak ciasteczek.
Możesz także tworzyć niestandardowe instancje do obsługi określonych po stronie serwera plików cookie, które są zapisywane inaczej. Weźmy na przykład PHP, który konwertuje spacje po stronie serwera na znak plus
+
zamiast kodowania procentowego:
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, ' ')
});
});
Użycie niestandardowego dostawcy może wyglądać mniej więcej tak:
module.service( "customDataStore", [ "phpCookies", function( phpCookies ) {
this.storeData = function( data ) {
phpCookies.set( "data", data );
};
this.containsStoredData = function() {
return phpCookies.get( "data" );
}
}]);
Mam nadzieję, że to pomoże każdemu.
Zobacz szczegółowe informacje w tym numerze: https://github.com/js-cookie/js-cookie/issues/103
Szczegółowe informacje na temat integracji z serwerem znajdują się tutaj: https://github.com/js-cookie/js-cookie/blob/master/SERVER_SIDE.md
Oto prosty przykład przy użyciu $ cookies. Po kliknięciu przycisku plik cookie jest zapisywany, a następnie przywracany po ponownym załadowaniu strony.
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");
};
}]);
})();