在AngularJS控制器之间的数据共享 [英] Share data between controllers in AngularJS
问题描述
我用下面的工厂,从API获取数据,并将其存储到一个名为apiData。局部变量
I use the following factory to fetch data from API and store it to local variable called apiData.
app.factory('MyFactory', function($resource, $q) {
var apiData = [];
var service = {};
var resource = $resource('http://example.com/api/sampledata/');
service.getApiData=function() {
var itemsDefer=$q.defer();
if(apiData.length >0) {
itemsDefer.resolve(apiData);
}
else
{
resource.query({},function(data) {
apiData=data;
itemsDefer.resolve(data)
});
}
return itemsDefer.promise;
};
service.add=function(newItem){
if(apiData.length > 0){
apiData.push(newItem);
}
};
service.remove=function(itemToRemove){
if(apiData.length > 0){
apiData.splice(apiData.indexOf(itemToRemove), 1);
}
};
return service;
});
我注入apiData到我的控制器通过以下方式:
I inject the apiData into my controllers the following way:
$routeProvider
.when('/myview', {
templateUrl: 'views/myview.html',
controller: 'MyController',
resolve: {
queryset: function(MyFactory){
return MyFactory.getApiData();
}
}
})
app.controller('MyController', ['$scope', 'queryset',
function ($scope, queryset) {
$scope.queryset = queryset;
}
]);
它是分享不同的控制器或我更好地使用本地存储,甚至cacheFactory之间的承诺的好办法?
Is it a good way to share a promise between different controllers or I better to use local storage or even cacheFactory?
我怎么可以重写MyFactory add()和remove()方法,这样我可以保持我的共享变量的当前状态(没有API更新/创建/删除所需的调用)?
How can I rewrite MyFactory add() and remove() methods so that I can keep my shared variable in a current state (no API update/create/delete calls needed)?
感谢您!
推荐答案
您应该使用$资源来获得$承诺如: resource.query()$承诺
代替的 $ q.defer()
清洁code。否则,你是好去。你可以使用 $ cacheFactory
,但你也可以使用本地变量。
You should use $resource to get $promise eg: resource.query().$promise
instead of $q.defer()
for cleaner code. Otherwise you are good to go. You could use $cacheFactory
, but you can also use local var.
是不是与目前的code在当前状态下的共享变量?
Isn't your shared variable in a current state with current code?
我建议你看看 UI路由器及其嵌套的和抽象的观点,在解析值可供子控制器。
I recommend you take a look at ui-router and its nested and abstract views, where resolved values are available to child controllers.
这篇关于在AngularJS控制器之间的数据共享的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!