【问题标题】:Keeping created data in AngularJS在 AngularJS 中保存创建的数据
【发布时间】:2015-05-15 14:35:20
【问题描述】:

我有一个关于在 AngularJS 中保存数据的一般性问题。是否有机会将数据保存在 json 文件中并在您更改站点时保留它们?我的意思是当我将站点从“人员”更改为“家”并返回到“人员”时,创建的数据是否保留在人员列表中?我该如何解决这个问题?还是只能使用例如用 Java/C# 编写的 WebApi 来执行此操作?有人知道吗?

我目前的例子是在json数据列表中推送数据:

$scope.addItem = function (item) {
  $scope.list.push(item);
  $scope.item = null;
};

【问题讨论】:

  • 使用 API 系统保存数据的最佳方式。我不知道您的情况,但例如您可以使用 localStorage 将数据保存到浏览器中很长时间
  • 只是出于兴趣。好吧,如果我切换页面,我可以使用 localStorage 保留数据,不是吗?
  • 哦,是的!试试这个服务github.com/grevory/angular-local-storage.. 我在我的项目中使用
  • @gianarb 好的,谢谢。我会试试这个模块。这是否也用于 REST API 应用程序,或者我不需要 REST API 中的 localStorage?
  • 示例.. 我使用 localStorage 进行用户配置和用户登录后保存身份.. 我使用 API 保存我的所有数据.. 例如通过 API 将人员列表放入数据库:)跨度>

标签: javascript json angularjs api


【解决方案1】:

这取决于您希望将数据保留多长时间,但有几种选择。如果您想在您的应用程序之间共享数据,就在用户访问您的网站时,任何有角度的“服务”(工厂、服务、提供者)都可以工作,因为它们都是单例的。有关差异的更多信息,请查看此答案:AngularJS: Service vs provider vs factory

如果您希望在用户访问期间保留数据,则应考虑使用 LocalStorage。这里有一个很棒的 Angular 本地存储模块:https://github.com/grevory/angular-local-storage

【讨论】:

    【解决方案2】:

    我可以想到 3 种方法来获得这个

    创建自定义服务

    您可以利用专用的 Angular 服务在控制器之间存储和共享数据(services 是单实例对象)

    服务定义

     app.service('commonService', function ($http) {
    
            var info;
    
            return {
                getInfo: getInfo,
                setInfo: setInfo
            };
    
            // .................
    
            function getInfo() {
                return info;
            }
    
            function setInfo(value) {
                info = value;
            }
    });
    

    在多个控制器中的使用

    app.controller("HomeController", function ($scope, commonService) {
    
        $scope.setInfo = function(value){
            commonService.setInfo(value);
        };
    
    });
    
    
    app.controller("PersonsController", function ($scope, commonService) {
    
        $scope.info = commonService.getInfo();
    
    });
    

    使用本地存储

    您可以使用内置的浏览器本地存储并从任何地方存储您的数据

    写作

    $window.localStorage['my-data'] = 'hello world';
    

    阅读

    var data = $window.localStorage['my-data']
    // ...
    

    通过服务器 api

    如果你需要在不同用户之间持久化数据,你应该把它保存在服务器端的某个地方(db/cache)

    function getProfile() {
        return $http.get(commonService.baseApi + '/api/profile/');
    }
    
    function updateProfile(data) {
        var json = angular.toJson(data);
        return $http.post(commonService.baseApi + '/api/profile/', json);
    }
    

    【讨论】:

    • 不错的答案。我会试试的。
    【解决方案3】:

    不知道这是否是你要找的东西,但你可以使用在页面之间共享的“$rootscope”(如果你愿意,有点像会话)。 您可以像在 $scope 中一样在其中存储数据,并且您的控制器必须在参数中采用 $rootscope

    【讨论】:

    • 共享作用域不被认为是邪恶的吗?
    • 这是可能的:P。但这是一个解决方案:P。 (可能过时或丑陋,但我现在什么都不知道:/)
    【解决方案4】:

    有很多方法可以做到这一点。

    您要么使用$rootScope,要么创建一个service 来保存全局变量。

    $rootScope 示例

    // Angular
    angular.module('app', [])
           .controller('PersonsController', function ($rootScope) {
    
                $rootScope.personsList = [
                    {
                        name: 'Eve',
                        gender: 'Female'
                    },
                    {
                        name: 'John',
                        gender: 'Male'
                    }
                ];
    
           })
           .controller('HomeController', function ($rootScope, $scope) {
    
                // You even don't need to store it in $scope
                // You just use $root.personsList directly in your HTML
    
           });
    
    // HTML
    <div ng-controller="HomeController">
        <ul>
            <li ng-repeat="person in $root.personsList">
                <p>{{ person.name }}</p>
                <p>{{ person.gender }}</p>
            </li>
        </ul>
    </div>
    

    服务示例

    // Angular
    angular.module('app', [])
           .service('SharedData', function() {
    
                var sharedData = {};
                var vm = this;
                    vm.Set = Set;
                    vm.Get = Get;
    
                /**
                 * Set a shared data identified by its key.
                 * 
                 * @param {String} key - Unique key identifier
                 * @param {Any} value - Value to be set
                 */
                function Set(key, value) {
                    sharedData[key] = value;
                }
    
                /**
                 * Retrieve a shared data.
                 * 
                 * @param {String} key - The key identifier
                 */
                function Get(key) {
                    if (sharedData[key])
                        return sharedData[key];
                    else
                        return null;
                }
    
           })
           .controller('PersonsController', function (SharedData) {
    
                var personsList = [
                    {
                        name: 'Eve',
                        gender: 'Female'
                    },
                    {
                        name: 'John',
                        gender: 'Male'
                    }
                ];
    
                SharedData.Set('personsList', personsList);
    
           })
           .controller('HomeController', function ($scope, SharedData) {
    
                $scope.personsList = SharedData.Get('personsList');
    
           });
    
    // HTML
    <div ng-controller="HomeController">
        <ul>
            <li ng-repeat="person in personsList">
                <p>{{ person.name }}</p>
                <p>{{ person.gender }}</p>
            </li>
        </ul>
    </div>
    

    我没有测试过代码,但我希望你能明白它们之间的关系。

    【讨论】:

    • 谢谢 :) 简短的问题。我经常在教程中看到它。为什么“this”在变量中?这种方法有什么优势?
    • 不客气 :),好吧,服务是用 new 关键字实例化的,不像工厂(尽管它们都是单例),所以 this 关键字将引用它自己的实例化对象。没有什么太大的优势,它只是让你的代码更有条理(在我看来)。
    • 感谢信息 :) 只有一个问题。为 CRUD 操作创建服务会更好吗?
    • 是的,非常!将逻辑与 CRUD 操作分开是一种很好的做法。
    • 哦,抱歉没明白你的意思。好吧,将其作为一项服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2016-07-15
    相关资源
    最近更新 更多