2

我在我当前的项目中使用 AngularJS,我正在尝试实现一个功能来检测浏览器中是否禁用了 cookie。我尝试使用 AngularJS 模块“ngCookies”来解决这个问题。此功能的主要思想是创建一些 cookie,然后检查此 cookie 是否已创建(并且可用),如果没有则显示消息。但它没有奏效。

控制器:

someProject.controller('CookieCtrl', ['$scope', '$cookieStore', function($scope, $cookieStore) {
    $scope.areCookiesEnabled = false;

    $cookieStore.put("TestCookie", "TestCookieText");
    $scope.cookieValue = $cookieStore.get("TestCookie");

    if ($scope.cookieValue) {
        $cookieStore.remove("TestCookie");
        $scope.areCookiesEnabled = true;
    }
}]);

看法:

<div class="main" data-ng-controller="CookieCtrl">
    <div class="warning_message" data-ng-show="!areCookiesEnabled">
        <span data-ng-bind="areCookiesEnabled"></span>
    </div>
</div>

谁能告诉我我的错误在哪里?

4

2 回答 2

2

查看:

<div class="warning_message" data-ng-show="!areCookiesEnabled">

data-ng-show="!areCookiesEnabled"正在评估为false。因此,如果存在 cookie,您的消息将不会显示。

我做了一个显示这个的plunker。控制器代码很好,只需删除 ng-show 即可查看,或从 更改!areCookiesEnabledareCookiesEnabled.

[编辑]

使用 $cookieStore 创建 cookie 后,调用方法 $window.cookies();

此方法将返回所有创建的 cookie。例子:

Object {__utmnodejs: "0x0ceb506e0755ba20", __utma: "137862001.1755124536.1363704654.1383162104.1383305355.73", __utmb: "137862001.2.10.1383305355", __utmc: "137862001", __utmz: "137862001.1383305355.73.49.utmcsr=stackoverflow.co…s-are-disabled-in-browser-with-angularjs/19719108"…}

如果 cookie 被禁用,将返回一个空对象:

Object {} 

发生这种情况是因为$cookieStore缓存了所有创建的 cookie,因此,即使它们不可用,您也会在$cookie服务中看到缓存的值。

http://plnkr.co/edit/TiG6Zx5UKrF8BT9lmdId?p=preview

于 2013-11-01T00:44:40.093 回答
1

仅供寻求解决方案的人参考:

如果您不需要进一步控制 cookie,则不是“必须/必须”使用 ngCookies。另外,有时我会更喜欢使用原生 js 而不是 Angular 封装的函数。

您可以只使用 navigator.cookieEnabled 来检查客户端的 cookie 支持是打开还是关闭。

例如:

function cookie () {
        var cookieEnable = navigator.cookieEnabled;

        if (typeof navigator.cookieEnabled === 'undefined' && !cookieEnable) {
            document.cookie = 'cookie-test';
            cookieEnable    = (document.cookie.indexOf('cookie-test') !== -1);
        }

        return cookieEnable;
    }

然后在你的控制器中:

$scope.enabled = cookie();

现在您可以轻松地将其注入任何元素。

更多本地存储支持:

var localStorageChecker = function() {
            var item    = 'local-storage-test',
                status  = true;

            try {
                localStorage.setItem(item, item);
                localStorage.removeItem(item);
            } catch(e) {
                status = false;
            }

            return status;
        };

与 cookie 相同,在您的控制器中:

$scope.localStorageSupport = localStorageChecker();

顺便说一句,你最好把这个函数放在你的服务中,比如 initService,然后你可以在你的应用程序初始化或注入任何你喜欢的控制器时使用它。

如果您使用 controllerAs 可能会带来注入服务的优势:)

于 2015-01-29T02:17:04.103 回答