我正在尝试构建一个工厂作为我的数据库模型的临时区域,以及一个api来执行基本的CRUD调用.我希望能够通过将数据存储在服务或工厂中来访问数据,并保持api方法,以便我可以在控制器中执行这些操作.
$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"});
目前我在控制器中使用这样的文件夹工厂.
Folders.foldersData().success( function(data,status) { $scope.folder = data; }) .error( function(data,status) { Flash.warning("There was a problem fetching your data"); });
我知道我可以在控制器中解决一个承诺,但是我正在研究项目的大小,我喜欢在服务中访问文件夹模型的想法,而不必进行服务器调用来同步每次我做出改变时的数据.
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()称为空对象后,它总是会回来.
有没有办法将这些数据保存在Factory中,作为Folder模型的最新表示,而不是每次都依赖于命中服务器?
在Rails 4 API上运行角度1.2.3.
解决方法
您可以将承诺存储在服务中作为服务上的对象.我将上面的扩展演示分开来演示
http://plnkr.co/edit/2HqQAiD33myyfVP4DWg3?p=preview
与前面的示例一样,http调用只进行一次,但这次将promise添加到工厂创建的服务对象上的文件夹项中.
app.factory('myService',$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; } }; });