javascript - Angular : Access stored data in a factory after a $http call

标签 javascript angularjs angularjs-scope angularjs-service angularjs-factory

我正在尝试建立一个工厂作为我的数据库模型的暂存区,以及一个 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/

相关文章:

javascript - 使用 axios get 获取请求失败,状态代码为 403

javascript - 使用谷歌地图中的纬度和经度获取地点详细信息或建筑物名称(Places API?)

javascript - 如何获取导航栏上的当前元素并保存在本地存储上?

angularjs - 以 Angular 选择项目后保持菜单打开

javascript - 在 $watch 回调中使用 $scope 有意义吗?

javascript - 如何修复 Ajax 图像上传 - 返回的响应是 HTML 而不是图像

angularjs - 在 Web API 2 中如何接受简单类型作为 post 参数以及 Route 参数

javascript - ionic 分页

angularjs - angularjs 中的模板递归限制(摘要循环)

angularjs - 如何在 if 条件下调用 state.go 时阻止 Controller 的执行?