我正在尝试建立一个工厂作为我的数据库模型的暂存区,以及一个 api 来执行基本的 CRUD 调用。我希望能够通过将数据存储在服务或工厂中来访问数据,并保留 api 方法,以便我可以在 Controller 中执行此类操作。
$scope.folders = Folders.data(); // for a factory
$scope.folders = Folders.data; // for a Service
Folders.create({name: "My Stuff, $oid: { 5fwewe033333 }, user_id: CurrentUser.id"});
目前我在 Controller 中使用这样的文件夹工厂。
Folders.foldersData().success( function(data, status) {
$scope.folder = data;
})
.error( function(data,status) {
Flash.warning("There was a problem fetching your data");
});
我知道我可以在 Controller 中解决一个 promise ,但是考虑到我正在处理的项目的规模,我喜欢在服务中访问文件夹模型的想法,而不必进行服务器调用每次我进行更改时同步数据。
angular.module('cmsApp')
.factory('Folders', function($http, $q){
var folders = {};
var messageWarn = "Upload Retrival Failed.";
return {
get: function(){
var defered = $q.defer();
$http.get('/folders').success( function ( data, status ) {
defered.resolve(data);
})
.error( function ( data, status ) {
defered.reject();
Flash.warning(message_warn);
});
defered.promise.then( function (promise)
folders = promise;
});
},
data: function (){
return folders;
},
}
});
我的问题是在调用 Folders.get() 后我无法保持文件夹对象持续存在。它总是在我将 Folders.data() 作为空对象调用后返回。
有没有一种方法可以将此数据作为 Folder 模型的最新表示保存在 Factory 中,而不依赖于每次都访问服务器?
在 Rails 4 API 上运行 angular 1.2.3。
最佳答案
您可以将 promise 作为服务对象存储在服务中。我 fork 了上面的扩展演示来演示 http://plnkr.co/edit/2HqQAiD33myyfVP4DWg3?p=preview
与前面的示例一样,http 调用仅进行一次,但这次 promise 被添加到由工厂创建的服务对象上的文件夹项中。
app.factory('myService', function($http, $q) {
return {
myObject: '',
get: function() {
// Create the deffered object
var deferred = $q.defer();
if(!this.myObject) {
// Request has not been made, so make it
$http.get('my-file.json').then(function(resp) {
console.log('Making the call!');
deferred.resolve(resp.data);
});
// Add the promise to myObject
this.myObject = deferred.promise;
}
// Return the myObject stored on the service
return this.myObject;
}
};
});
关于javascript - Angular : Access stored data in a factory after a $http call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21416298/