我正在尝试构建一个工厂作为我的数据库模型的临时区域,以及一个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;
- }
- };
- });