【问题标题】:Angular Factory data empty after $http$http 后 Angular Factory 数据为空
【发布时间】:2014-08-18 12:53:49
【问题描述】:

我正在尝试通过 http 请求方法将数据存储到 location[] 数组到 json 文件中。

问题是我的列表控制器总是包含一个空数组。

我的工厂

app.factory('listing__data', function($http, $q){
  return {
    locations: '',
    makeRequest: function(url) {
      // Create the deffered object
      var deferred = $q.defer();

      $http.get('/'+url).then(function(resp) {
        deferred.resolve(resp.data);
      });
      return deferred.promise;
    },
    getUrl: function(params) {
      var url = "locations.json";

      if(!this.locations) {
        this.locations = this.makeRequest(url);
      }
      // Return the myObject stored on the service
      return this.locations;
    }
  };
});

我的控制器

var listings__controller = app.controller('listings__controller', function($scope, distance__service, listing__data) {
    $scope.locations = [];

    listing__data.getUrl(distance__service.meters).then(function(data) {
    $.each(data.listings, function(i, item) {
          $scope.locations.push(item.location);
          console.log(item.location); // ** Shows Correct Object **
        });
    });
    console.log("How many inside:"+$scope.locations.length); // ** Empty - Shows 0 **
});

我似乎无法弄清楚为什么我的$scope.locations = [] 仍然是空的

【问题讨论】:

  • 你填写$scope.locations,你打印$scope.geoLocations的长度。
  • 您的listing__data.makeRequestDeferred anti-pattern 的一个示例。 $http.get 已经返回了一个承诺,所以不需要延迟:return $http.get(...).then(function (resp) { return resp.data; });
  • @JBNizet 原谅错字,正在重构代码以粘贴到这里

标签: angularjs


【解决方案1】:

即使没有 JB Nizet 提到的拼写错误,您仍然会看到 0,因为 console.log("How many inside:"+$scope.locations.length); 在您传递给 listing__data.getUrl(distance__service.meters).then 的回调之前执行,因为后者是异步的。

请记住,当使用异步函数时,执行流程不会遵循源代码的行顺序。

promise.then(function () {
    console.log('inside callback');
});
console.log('outside callback');

将打印outside callback 然后 inside callback

因此,如果您要使用存储在 $scope.locations 中的值,则必须在回调中进行

【讨论】:

  • $scope.locations = [] 中的地理位置需要由另一个库处理。将它存储在同一范围内以便我可以遍历这些值的正确方法是什么?
  • 另一个库不需要将数据附加到范围。在回调中执行所有处理,然后将要显示的内容附加到范围。
  • 我有两个控制器以这个列表数据为食。第一个控制器让我们称之为controller_1 列出位置并允许用户删除或收藏。第二个控制器controller_2 将位置输出到地图。它们都需要可绑定,因此在controller_1 中,如果我从该数组中删除一个对象,它也会从我的地图中删除。在这种情况下,仍然需要在您提到的回调中完成所有操作吗?
  • 请参阅this fiddle,了解如何使用服务在控制器之间共享承诺数据的示例。
  • 如果您对在控制器之间共享数据还有其他问题,我建议您发布一个新问题(或查找已经回答的问题),因为这完全是另一回事。这个问题是关于编写正确的异步代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 2020-07-12
  • 2017-08-08
  • 2014-04-15
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多