从非角度代码访问angular $ cookies

时间:2015-07-18 11:38:41

标签: angularjs cookies

我有一个test模块,将cookie isTesting设置为true

app.controller('test_page',
    ['$scope', '$window', 'userService', 'flash', '$cookies',
function($scope, $window, userService, flash, $cookies) {
    helper.initCommonScope($scope, $window, userService, flash)

    $scope.refreshShownHidden = function() {
        $scope.showTurnOffTest = $cookies.get('isTesting')
        $scope.showTurnOnTest = ! $cookies.get('isTesting')
    }

    $scope.turnOnTest = function() {

        $cookies.put('isTesting', true)
        $scope.refreshShownHidden()
        helper.turnOnTest()
    }
    $scope.turnOffTest = function() {
        $cookies.put('isTesting', false)
        $scope.refreshShownHidden()
        helper.turnOffTest()
    }

    $scope.refreshShownHidden()

}])

在helper.js中,我有

exports.havePermission = function(access, resource, userService, entity) {
    //Note: In debugging, we can grant client helper all access, and test robustness of server
    if (angular.$cookies.isTesting)
        return true
    return permission.havePermission(access, resource, userService.isAuthenticated(), entity, userService.user)
}

但$ cookies不可用,因为helper.js不是任何角度模块的一部分,因此没有DI可用。如何访问isTesting值?

我尝试使用window.isTesting,但在刷新页面或转到其他页面时,它不会保留。所以cookie是更好的选择

4 个答案:

答案 0 :(得分:3)

您可以使用Angular的注入器访问Angular应用程序之外的Angular模块和服务。

AngularJS代码

/*
* Atomicly increment an index into short_buffer
*/
static inline void short_incr_bp(volatile unsigned long *index, int delta)
{
    unsigned long new = *index + delta;
    barrier(); /* Don't optimize these two together */
    *index = (new >= (short_buffer + PAGE_SIZE)) ? short_buffer : new;
}

非角色代码

angular.module('app', ['ngCookies']).
  controller('ctrl', ['$cookies', function($cookies) {
    $cookies.put('isTesting', true);
  }]);

<强> HTML

helper = {
  getCookies: function() {
    // Create new injector for ngCookies module
    var $injector = angular.injector(['ngCookies']);

    // Inject $cookies to some function and invoke it
    $injector.invoke(['$cookies', function($cookies) {
      alert($cookies.get('isTesting'));
    }]);
  }
}

Plunker:http://plnkr.co/edit/jur9A6d69ViiJqiFgopD?p=preview

答案 1 :(得分:2)

var cookies = angular.injector(['ngCookies']).get('$cookies');

它会创建$cookies服务的新实例,因此如果您在整个应用中使用它,最好将其导出到全局。

答案 2 :(得分:1)

你试过jquery-cookie吗?

bower/npm install --save jquery-cookie


$scope.refreshShownHidden = function() {
    $scope.showTurnOffTest = $.cookie('isTesting')
    $scope.showTurnOnTest = ! $.cookie('isTesting')
}

$scope.turnOnTest = function() {
    $.cookie('isTesting', true)
    //...
}

然后在你的助手中:

exports.havePermission = function(access, resource, userService, entity) {
    if ($.cookie('isTesting'))
        return true
        //...
}

我不建议在这种情况下使用角度,因为你的助手不是角度应用程序。

答案 3 :(得分:0)

这不是AngularJS的目的。您应该尝试将所有内容保存在AngularJS代码中。但是,您可以在AngularJS中设置任何全局变量:

app.controller('test_page',
    ['$scope', '$window', 'userService', 'flash', '$cookies',
function($scope, $window, userService, flash, $cookies) {
    angular.$cookies = $cookies;
    // or window.$cookies = $cookies;
    helper.initCommonScope($scope, $window, userService, flash)

然后您可以随时随地访问$ cookies。它使某些事情变得更容易但更不安全(任何其他脚本也可以访问它,它可能会产生冲突等)。