AngularJS 1.2在服务中存储数据数组

AngularJS 1.2在服务中存储数据数组,angularjs,angularjs-service,Angularjs,Angularjs Service,我有一个问题,寻求建议,关于如何将存储在服务数组中的数据获取到控制器,因为在1.2中取消了取消包装承诺 例如: 路线1包含一个项目列表 路线2包含一个用于添加新项目的表单 从路线拖航保存项目后,用户将重定向回路线一 当route one最初加载时,服务将向服务器发出项目请求,并将项目存储在服务中的一个数组中,这样之后对route one的每个请求都将返回一个数组。保存项时,该项会被推送到服务中的数组中 如果我在初始加载时在route one的控制器中等待承诺,没有问题,因为返回了响应,但之后对r

我有一个问题,寻求建议,关于如何将存储在服务数组中的数据获取到控制器,因为在1.2中取消了取消包装承诺

例如:

  • 路线1包含一个项目列表
  • 路线2包含一个用于添加新项目的表单
  • 从路线拖航保存项目后,用户将重定向回路线一
  • 当route one最初加载时,服务将向服务器发出项目请求,并将项目存储在服务中的一个数组中,这样之后对route one的每个请求都将返回一个数组。保存项时,该项会被推送到服务中的数组中

    如果我在初始加载时在route one的控制器中等待承诺,没有问题,因为返回了响应,但之后对route one的每个请求都会返回一个错误,因为我返回了一个数组

    关于如何在1.2中实现类似的功能,有什么想法吗

    app.factory('Items',function($http) {
        var items = [];
        return {
            list: function() {
                if (items.length == 0) {    // items array is empty so populate it and return list from server to controller
                    return $http.get('/?items').then(function(response) {
                        items = response.data.items;
                        return response.data.items;
                    });
                }
                return items;   // items exist already so just return the array
            },
            save: function(item) {
                return $http.post('/',{item:item}).then(function(response) {
                    items.push(item);
                    return response;
                });
            }
        }
    });
    
    app.controller('RouteOne',function($scope,Items) {
        Items.list().then(function(response) {
            $scope.items = response;
        });
    
        /* used to be this before unwrapped promises were removed
        $scope.items = Items.list();
        */
    
    });
    
    app.controller('RouteTwo',function($scope,Items) {
        $scope.new_item = {};
        $scope.addItem = function() {
            Items.save($scope.new_item).then(function(response) {
                $location.path('/');    // back to route one
            });  
        };
    });
    
    由于XHR调用,必须修改下面给出的解决方案 本例的主要思想是使用简单的js将引用绑定到模型

    Items.save
    必须始终返回对其本地作用域数组的引用
    Items


    var-app=angular.module('app',['ui.router']);
    app.config(函数($stateProvider){
    $stateProvider
    .州(‘一’{
    url:“/”,
    模板:“
    • {{item.value}
    ”, 控制器:“RouteOne” }) .州(“两个”{ url:“/two”, 模板:“添加项”, 管制员:“Routewo” }); }); app.run(函数($state){ $state.go('one'); }); app.factory('Items',函数($http){ var项目=[]; 返回{ 列表:函数(){ 如果(items.length==0){//items数组为空,则填充它并将列表从服务器返回给控制器 //我只是对JSFIDLE的请求做了一些修改 $http.get('/echo/jsonp/?items=[{“value”:1},{“value”:2},{“value”:3},{“value”:4},{“value”:5}]')。然后(函数(响应){ //你不需要下一行真正的服务器 response.data=JSON.parse(response.data.items); Array.prototype.push.apply(项目、响应、数据); }); //只需始终返回对项目的引用 //因为它将在以后填充 退货项目; } return items;//项已经存在,只需返回数组即可 }, 保存:功能(项目){ 返回$http.post('/echo/jsonp/',{item:item}){ 项目。推送(项目); 返回响应; }); } } }); 应用控制器('RouteOne',功能($scope,Items){ //不要做任何你想做的事,因为装订是为你做的 $scope.items=items.list(); }); 应用控制器('RouteVo',功能($scope,Items,$location){ $scope.new_item={}; $scope.addItem=函数(){ 保存($scope.new_item)。然后(函数(响应){ $location.path(“/”);//返回路线一 }); }; });
    您可以让服务返回自己的承诺,它可以使用缓存值或$http承诺的结果进行解析。我还没有完全测试过这个,但它可能看起来像这样:

    app.factory('Items', function($q, $http) {
        var items = [];
        return {
            list: function() {
                var deferred = $q.defer();
                if (items.length == 0) {    // items array is empty so populate it and return list from server to controller
                    $http.get('/?items').then(function(response) {
                        items = response.data.items;
                        deferred.resolve(response.data.items);
                    });
                } else {
                    deferred.resolve(items);   // items exist already so just return the array
                }
                return deferred.promise;
            },
            save: function(item) {
                return $http.post('/',{item:item}).then(function(response) {
                    items.push(item);
                    return response;
                });
            }
        }
    });
    
    app.controller('RouteOne',function($scope,Items) {
        Items.list().then(function(response) {
            $scope.items = response;
        });
    
    });
    

    另外,对于您的特定用例,您可以将延迟的应用程序移动到服务级别,而不是功能级别,因为您只需要调用一次,但我编写的方法更灵活,以防您想要清除项目数组。

    Ah,承诺。我从这些开始,但没有想到它的延迟解决方面。我开始修补$rootScope,但我确信这不是答案。谢谢!解决了我的问题。这确实有效,但是,我不希望使用变通方法来获得在控制器中工作的未包装承诺。我不介意在控制器中使用承诺,但当承诺没有返回时,我遇到了一个错误。
    app.factory('Items', function($q, $http) {
        var items = [];
        return {
            list: function() {
                var deferred = $q.defer();
                if (items.length == 0) {    // items array is empty so populate it and return list from server to controller
                    $http.get('/?items').then(function(response) {
                        items = response.data.items;
                        deferred.resolve(response.data.items);
                    });
                } else {
                    deferred.resolve(items);   // items exist already so just return the array
                }
                return deferred.promise;
            },
            save: function(item) {
                return $http.post('/',{item:item}).then(function(response) {
                    items.push(item);
                    return response;
                });
            }
        }
    });
    
    app.controller('RouteOne',function($scope,Items) {
        Items.list().then(function(response) {
            $scope.items = response;
        });
    
    });