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 が存在する場合、メッセージは表示されません。

これを示すプランカーを作成しました。コントローラーのコードは問題ありません。表示するには ng-show を削除するか、 から に変更し!areCookiesEnabledてくださいareCookiesEnabled

[編集]

$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 が無効になっている場合は、空の obkect が返されます。

Object {} 

これは$cookieStore、作成されたすべての Cookie をキャッシュするために発生しているため、それらが使用できない場合でも、キャッシュされた値が$cookieサービスに表示されます。

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

于 2013-11-01T00:44:40.093 に答える
1

解決策を探している人の参考のために:

Cookie をさらに制御する必要がない場合は、ngCookies を使用する必要はありません。さらに、Angular カプセル化関数よりもネイティブ js を使用することを好む場合があります。

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 に答える