【问题标题】:Maintaining Session through Angular.js通过 Angular.js 维护会话
【发布时间】:2013-02-04 03:10:03
【问题描述】:

我正在使用 AngularJS 框架进行项目。我对使用这个框架很陌生;过去我只使用纯 JavaScript 和 jQuery。该项目是一种针对小众市场的网页设计师应用程序。

当用户在设计时在页面之间移动时,我想维护他们所做的所有更改的会话。

现在,如果用户登录,我们将使用数据库中的数据加载会话。当用户单击保存按钮时,我们使用会话数据更新数据库。有人告诉我,我可以在 Angular 中维护会话,类似于骨干网。这可能吗?如果是的话,你能指导我看一个不关注指令或 UI 的教程吗?如果这不可能,还有其他可行的选择吗?

【问题讨论】:

    标签: session angularjs


    【解决方案1】:

    这是给你的一种sn-p:

    app.factory('Session', function($http) {
      var Session = {
        data: {},
        saveSession: function() { /* save session data to db */ },
        updateSession: function() { 
          /* load data from db */
          $http.get('session.json').then(function(r) { return Session.data = r.data;});
        }
      };
      Session.updateSession();
      return Session; 
    });
    

    这是 Plunker 示例,您可以如何使用它: http://plnkr.co/edit/Fg3uF4ukl5p88Z0AeQqU?p=preview

    【讨论】:

    • 这个会话数据可以存储在本地存储中吗?如果用户关闭浏览器并返回...
    • 请记住,本地存储是跨子域共享的,所以不太安全。
    • 所以在你的情况下,如果用户关闭他的浏览器,他无论如何都会注销?
    • 可以使用SessionStore吗?缺点是它不在打开的窗口之间共享……但对于 SPA 来说还可以。
    • @ValentynShybanov 我很确定 localStorage 在域之间共享,甚至在子域之间。转到unix.stackexchange.com - 打开控制台并添加window.localStorage.setItem('shared', 'yes') 然后转到dba.stackexchange.com,打开控制台并返回window.localStorage.getItem('shared') null LocalStorage 不共享,不能没有一些技巧。
    【解决方案2】:

    因为对于更稳定的 Angular 版本,答案不再有效,所以我发布了一个更新的解决方案。

    PHP 页面:session.php

    if (!isset($_SESSION))
    {    
        session_start();
    }    
    
    $_SESSION['variable'] = "hello world";
    
    $sessions = array();
    
    $sessions['variable'] = $_SESSION['variable'];
    
    header('Content-Type: application/json');
    echo json_encode($sessions);
    

    在 Angular 中只发回你想要的会话变​​量,并不是所有的变量都不想暴露比需要的更多的变量。

    JS 齐心协力

    var app = angular.module('StarterApp', []);
    app.controller("AppCtrl", ['$rootScope', 'Session', function($rootScope, Session) {      
        Session.then(function(response){
            $rootScope.session = response;
        });
    }]);
    
     app.factory('Session', function($http) {    
        return $http.get('/session.php').then(function(result) {       
            return result.data; 
        });
    }); 
    
    • 使用工厂进行简单的 get 获取会话。
    • 如果您想让它发布以使您在浏览器中访问该页面时不可见,您可以,我只是简化它
    • 将工厂添加到控制器中
    • 我使用 rootScope 是因为它是我在所有代码中都使用的会话变量。

    HTML

    在您的 html 中,您可以引用您的会话

    <html ng-app="StarterApp">
    
    <body ng-controller="AppCtrl">
    {{ session.variable }}
    </body>
    

    【讨论】:

      【解决方案3】:

      您也可以尝试基于window.sessionStoragewindow.localStorage 进行服务,以在页面重新加载之间保持状态信息。我在部分由 AngularJS 制作的 web 应用程序中使用它,并且页面 URL 在工作流的某些部分以“旧方式”更改。甚至 IE8 也支持 Web 存储。为方便起见,这里是angular-webstorage

      【讨论】:

      • 我在另一个项目中使用了 localStorage。我必须说我发现它很有帮助。我很高兴我们找到了一个可行的饼干替代品。它速度快并且有足够的存储空间,不像 cookie 那样慢,因为我们必须从文件中读取 cookie,而且每个 cookie 的数据量非常有限。另一个优点是 localStorage 数据不能跨域使用。因此,没有其他域可以读取您的数据,也不会与变量名发生冲突。我发现的唯一问题是我们无法指定任何到期时间。我希望它们确实包含在未来的更新中。
      • @Jehanzeb.Malik 网络存储使您能够定义自己的到期范围。只需添加一个带时间戳的键值并实现您自己的逻辑来覆盖数据,或者只需 window.localStorage.clear() 即可擦除所有内容。
      • 这就是重点。我们必须创建一个逻辑来使 Web 存储中的某些内容过期。只有当我们的代码(网页)在浏览器上运行并且在此期间编码的调度程序决定过期并删除数据时,我们的逻辑才会运行。我开发的大多数 Web 应用程序都要求数据过期。 “如果”大多数为 Web 开发的整体应用程序都需要一种功能,而不是应该由浏览器实现和标准化。这些小事为开发者节省了大量时间。
      【解决方案4】:

      您将在 Angular 中为此使用服务。服务是您在 Angular 中注册的函数,该函数的工作是返回一个对象,该对象将一直存在到浏览器关闭/刷新。因此,这是一个存储状态的好地方,并在状态发生变化时将该状态与服务器异步同步。

      【讨论】:

        【解决方案5】:

        通常对于涉及一系列页面的用例,在最后阶段或页面中,我们将数据发布到服务器。在这种情况下,我们需要维护状态。在下面的 sn-p 中,我们维护客户端的状态

        如上篇文章所述。会话是使用工厂配方创建的。

        客户端会话也可以使用价值提供者配方来维护。

        请参阅我的帖子以获取完整的详细信息。 session-tracking-in-angularjs

        让我们举一个购物车的例子,我们需要在不同的页面/angularjs 控制器中维护它。

        在典型的购物车中,我们在各种产品/类别页面上购买产品并不断更新购物车。步骤如下。

        在这里,我们使用“价值提供者配方”创建了包含购物车的自定义可注入服务。

        'use strict';
        function Cart() {
            return {
                'cartId': '',
                'cartItem': []
            };
        }
        // custom service maintains the cart along with its behavior to clear itself , create new , delete Item or update cart 
        
        app.value('sessionService', {
            cart: new Cart(),
            clear: function () {
                this.cart = new Cart();
                // mechanism to create the cart id 
                this.cart.cartId = 1;
            },
            save: function (session) {
                this.cart = session.cart;
            },
            updateCart: function (productId, productQty) {
                this.cart.cartItem.push({
                    'productId': productId,
                    'productQty': productQty
                });
            },
            //deleteItem and other cart operations function goes here...
        });
        

        【讨论】:

          猜你喜欢
          • 2016-11-04
          • 1970-01-01
          • 2018-04-29
          • 2010-12-17
          • 2018-06-09
          • 1970-01-01
          • 2014-11-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多