gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:50:16 24 4
gpt4 key购买 nike

我有一个问题,寻求建议,关于如何将存储在服务数组中的数据获取到 Controller ,因为解包 promise 在 1.2 中被删除。

示例:

  1. 路线一包含项目列表
  2. 路线二包含一个用于添加新项目的表单
  3. 从路线拖车中保存项目后,用户将被重定向回路线一。

当路由一最初加载时,服务将向服务器发出请求以获取项目,将项目存储在服务中的数组中,因此此后对路由一的每个请求都只会返回一个数组。保存项目后,该项目将被推送到服务中的数组中。

如果我要在初始加载时等待路由 Controller 中的 promise ,那么没有问题,因为响应已发回,但此后路由 Controller 的每个请求都会返回错误,因为我返回了一个数组。

关于如何在 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
});
};
});

最佳答案

您可以让服务返回自己的 Promise,它可以使用缓存值或 $http Promise 的结果进行解析。我还没有完全测试过这一点,但它可能看起来像这样:

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;
});

});

此外,根据您的特定用例,您可以将延迟移动到服务级别而不是函数级别,因为您只会调用它一次,但我编写它的方式更加灵活,以防您想要清除项目数组。

关于AngularJS 1.2 在服务中存储数据数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21736490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com