【问题标题】:How to persist data in a service on refresh in AngularJS?如何在 AngularJS 中刷新时将数据保存在服务中?
【发布时间】:2016-07-12 06:50:41
【问题描述】:

我正在为我的公司在几周内推出的一个新品牌创建一个新的多用途网站。我们使用 WordPress 后端并通过 WP REST API,现在能够解耦系统并将 NodeJS/Express/AngularJS 用于我们的前端和中间件应用程序。

目前,当我加载登录页面时,会向 WordPress 发出 HTTP GET 请求,以获取我们首页的所有相关帖子。然后将此数据传递给服务以跨控制器使用。

所以,初始设置是这样的:

着陆控制器

    angular
     .module('glossy')
     .controller('LandingController', LandingController)

    LandingController.$inject = ['featuredService', 'sharedPostsService'];

    function LandingController(featuredService, sharedPostsService){

     // Set up view model (vm) variables
     var vm = this;
     vm.featured = [];

     // Call this function on state 'home' load
     activate();

     // Calls getFeatured function and prints to console
     function activate(){
       return getFeatured()
         .then(function(){
           console.log('GET Featured Posts');
       });
     }

     // Calls the featuredService then stores response clientside for rendering
     function getFeatured(){
       return featuredService.getFeatured()
       .then(function(data){
          vm.featured = data;
          sharedPostsService.setPosts(data);
          return vm.featured;
        });
     }
   }

HTTP 请求工厂

    angular
     .module('glossy')
     .factory('featuredService', featuredService)

    featuredService.$inject = ['$http'];

    function featuredService($http){
      return {
       getFeatured: getFeatured
      };

      // Performs HTTP request then calls success or error functions
      function getFeatured(){
        return $http.get('/api/posts')
        .then(getFeaturedComplete)
        .catch(getFeaturedFailed);

        // Returns response data
        function getFeaturedComplete(response){
          return response.data;
        }

        // Prints error to console
        function getFeaturedFailed(error) {
          console.log('HTTP Request Failed for getFeatured: ' + error.data);
        }
      }
   }

保存工厂数据的服务

    angular
     .module('glossy')
     .factory('sharedPostsService', sharedPostsService)

    function sharedPostsService(){

      var listPosts = [];

      return {
        setPosts: function(posts){
          listPosts = posts;
        },
        getPosts: function(){
          return listPosts;
        }
      };
    }

现在,当用户点击登录页面上的帖子时,她会被带到一个页面,该页面显示在她点击的文章上,这很有效。但是,如果她刷新这个页面,所有的数据都没有了。调用服务会产生一个空对象。

后控制器

   angular
     .module('glossy')
     .controller('PostController', PostController)

   PostController.$inject = ['$window', '$filter', '$stateParams', 'sharedPostsService'];

   function PostController($window, $filter, $stateParams, sharedPostsService){

     var vm = this;
     vm.postsList = sharedPostsService.getPosts();
     vm.postTitle = $stateParams.title;
     vm.thisPost = filterPosts();

     function filterPosts() {
       return $filter('filter')(vm.postsList, vm.postTitle);
     };
   }

如何进行设置以确保数据通过刷新保持不变?我研究过使用 localStorage,但我发现的所有内容都说它涉及对数据进行字符串化并将其存储在键值对中?

感谢任何帮助。

【问题讨论】:

  • 你可能想看看 alaSQL。在许多环境中,sqlLite 已被弃用以支持 localStorage,这似乎是最好的。
  • @AmyBlankenship – 我不确定我需要创建一个浏览器内数据库,我需要做的就是保存我试图显示的单个帖子,以便它的数据不是刷新时删除。然后,每当我打开新帖子时,可以删除以前的帖子并保存新帖子,依此类推。
  • 我的理念是永远不要将自己困在开发时难以扩展的泡沫中。为需求很可能发生变化的想法编写代码并不比为它们不会发生变化的想法编写代码困难得多。在许多情况下,这更容易。

标签: javascript angularjs refresh


【解决方案1】:

您不能使用服务在页面刷新时保留数据。

如果数据很大,使用数据库,否则使用sessionStoragelocalStorage

存储数据

window.localStorage['data'] = JSON.stringify(data);

检索数据

return angular.fromJson(window.localStorage['data']);

【讨论】:

  • 如果我只想存储一个帖子,我将如何使用 localStorage 来做到这一点?我尝试将其保存到 $window.localStore.post = 但每当我尝试检索它时,它都会返回 [object Object]。
  • 查看我编辑的答案。您必须在存储时对其进行字符串化,并在获取时转换回 json。
  • 有几个 localStorage 库被设计用于 Angular。如果您只想使用 localStorage,使用其中之一可能更安全。请注意,如果您尝试在 localStorage 中放入过多内容,则会导致 iO 崩溃。
  • 是的,但在这种情况下,数据大小几乎不是问题。另外,我很好奇为什么我们需要库来使用 localStorage?
  • @TarunDugar 好的,存储数据工作正常,当我执行 console.log(angular.fromJson(window.localStorage['data']) 时,它会显示正确的数据,但如果我尝试将其保存到一个变量中,将变量 console.logs 保存到 [object Object]。有什么想法吗?
猜你喜欢
  • 2016-01-08
  • 2015-10-15
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
相关资源
最近更新 更多