【问题标题】:Passing Data Between Pages in AngularJS + Page Refresh在 AngularJS 中的页面之间传递数据 + 页面刷新
【发布时间】:2014-11-12 02:39:57
【问题描述】:

我正在尝试在应用程序的结帐过程中的页面之间传递数据,但它没有按应有的方式工作。我做了一些阅读,大多数人建议使用服务,但唯一的问题是当页面刷新(用户单击刷新或稍后返回)时,服务中的所有数据都会消失。这是有道理的,因为服务中的数据并不意味着是持久的,但它会导致问题。

所以问题是:如何在 angularJS 中的页面之间传递数据,并且仍然保留页面刷新后传递的数据?

这是我目前的代码(我尝试使用查询字符串):

.service('checkoutService', 
          function checkoutService($location, Address, $routeParams, TicketGroup) {
    var ticket_quantity = 0;
    var ticket_group = {};
    var selected_address = {};

    this.loadInformation = function() {
        if(!ticket_quantity && $routeParams.ticket_quantity)
            ticket_quantity = $routeParams.ticket_quantity;
        if(!ticket_group && $routeParams.ticket_group_id)
            ticket_group = TicketGroup.get({id: $routeParams.ticket_group_id});
        if(!selected_address && $routeParams.address_id)
            selected_address = Address.get({id: $routeParams.address_id});
    }

    this.setTicketQuantity = function(quantity) {
        ticket_quantity = quantity;
        $location.path().search({ticket_quantity: quantity});
    }
    this.getTicketQuantity = function() {
        return ticket_quantity;
    }

    this.setTicketGroup = function(object) {
        ticket_group = object;
        $routeParams.ticket_group = object.id;
    }
    this.getTicketGroup  = function() {
        return ticket_group;
    }

    this.setSelectedAddress = function(object) {
        selected_address = object;
        $routeParams.address_id = object.id;
    }
    this.getSelectedAddress = function() {
        return selected_address;
    }
});

【问题讨论】:

  • 你考虑过localStorage吗?
  • 还是使用ngCookie?或者将数据存储在服务器上并在刷新时重新加载。

标签: angularjs


【解决方案1】:

您可以使用 Session/LocalStorage。或者像 pounchdb 这样的浏览器数据库。 会话存储:存储会话数据; LocalStorage:存储数据而不仅仅是会话范围 pounchdb : 离线数据库

【讨论】:

  • 你应该详细说明你的答案
【解决方案2】:

有几种方法可以做到这一点,

  1. 对于较小的数据集,您可以使用 $cookieStore,用于 4k 以下的数据
  2. 另一个选项,尤其是对于大型数据集,是使用Local Storage,然后在页面加载/重新加载时检索数据。
  3. 如果只是非常少量的数据,或者通过多个页面使用的数据,您可以使用 $rootscope,但这不是最佳选择,因为它就像污染全局名称空间一样。
  4. 最后一个选项,根据检索数据的方式,可以实现service,这基本上是一个可以传递到各种角度范围的单例。

注意:只有前两个是持久的。

在您的情况下,我认为使用 本地存储cookiestore 将是您的最佳选择。您正在尝试使用服务,如果您不希望它是持久的(离开页面或刷新页面),这将是合适的。服务是由 Angular 管理的单例,当注入时,您将在每次注入中获得对同一对象的引用。但是,当返回页面时,这个单例需要重新初始化,从而丢失所有以前的数据。使服务持久化的唯一方法是从其他地方的数据库、本地文件或 noSQL 加载数据。但是,我认为这不是您真正想要的。

如果您对实现本地存储感兴趣,请查看这些模块 angular-local-storagengStorage 或此 answer

如果您想使用 cookiestore,请查看answer

【讨论】:

  • 拥有使用 $cookieStore 的服务非常适合这些类型的事情。这样您就可以轻松地从应用程序中的任何位置访问 cookie 值。
  • @robert.bo.roth 这将是一个有趣的解决方案,并且可能对很多人非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
相关资源
最近更新 更多