【问题标题】:angularjs empties array before populating with data?angularjs 在填充数据之前清空数组?
【发布时间】:2014-03-12 13:14:18
【问题描述】:

我正在尝试找到一种方法来最小化 jsonp 请求,因为 Angular 不会缓存这些请求。我的方法是将每个控制器中的空数组设置为一个主控制器,当它连接到主体时加载一次。之后,我将检查数组是否为空,如果是则使用服务并返回 json。 我现在的问题是,由于某种原因,我不明白在服务调用之外检查时数组是空的。

示例代码

angular.module('Feed.controllers', [])
  .controller('MainCtrl', function($scope)
  {
    function getYear()
    {
      var currentDate = new Date();
      return currentDate.getFullYear();
    }
    $scope.currentYear = getYear();
    $scope.StandingsList = [];

  })
  .controller('StandingsCtrl', function($scope, APIservice, $routeParams)
  {
    console.log($scope.StandingsList.length); // returns 0

    if ($scope.StandingsList.length === 0)
    {
      APIservice.getSomtehing().success(function (response)
      {
          $scope.StandingsList = response.jsonData;
          console.log($scope.StandingsList.length); // returns total entries
      });
    };

    console.log($scope.StandingsList.length); // returns 0

  })

MainCtrl 在 body 标记中,因为我在 HTML 中的各个位置使用 currentYear 使用路线和部分来调用 StandingsCtrl 以进行演示。带有 ng-view 的 div 在 MainCtrl 的 body 元素内

【问题讨论】:

  • 不要在控制器中进行本地缓存,在服务中这样做....数组为空的原因是因为每个控制器都实例化了新的$scope,所以你不是指向同一个变量
  • hmm 如果我没有指向同一个变量,那么为什么如果我从 MainCtrl 中删除该变量我会得到错误:$scope.StandingsList is undefined,这是正确的。
  • 我不确定你所说的“删除”变量是什么意思,但是两个控制器不共享任何 scope 变量,只有当它们是 rootScope 变量时,两个控制器都会继承它们,因为所有scopes 都是rootScope 的后代
  • 我的意思是如果我删除 $scope.StandingsList = [];在 MainCtrl 中,然后我得到未定义的错误,这意味着 StandingsCtrl 使用 MainCtrl 中的 StandingsList。我错了吗?
  • 你能创造一个小提琴吗?当我只看到定义而不看到 html 中的用法时,很难判断发生了什么

标签: javascript jquery arrays json angularjs


【解决方案1】:

MainCtrl 的 $scope 与 StandingsCtrl 中的 $scope 不同,您可能想要执行类似的操作以在控制器之间共享数据

angular.module('Feed.controllers', [])
    .factory('Standings', function() {
        var list = [];
        return {
            save: function(data) { /*push data into list*/ },
            list: list
        }
    })
    .controller('MainCtrl', function ($scope, Standings) {
        function getYear() {
            var currentDate = new Date();
            return currentDate.getFullYear();
        }

        $scope.currentYear = getYear();
        $scope.StandingsList = Standings.list;
    })
    .controller('StandingsCtrl', function ($scope, APIservice, Standings) {
        console.log(Standings.list.length); // returns 0

        if (Standings.list.length === 0) {
            APIservice.getSomething().success(function (response) {
                Standings.save(response.jsonData);
                $scope.StandingsList = response.jsonData;
            });
        }

    });

【讨论】:

    猜你喜欢
    • 2020-06-13
    • 2021-10-04
    • 1970-01-01
    • 2021-12-29
    • 2017-07-23
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多