从AngularJS中的控制器加载数据

时间:2015-05-06 13:09:05

标签: javascript angularjs

我有一个钻取屏幕流程:

Teams
    Team 1
        Player 1
        Player 2
        Player 3
        Player 4
    Team 2
        Player 1
        Player 2
        Player 3
    Team 3
        Player 1

每个人都有自己的控制器:

TeamsCtrl > TeamCtrl > PlayerCtrl

此外,每个团队和玩家都有自己的网址,Angular使用这些网址来识别项目:

/teams/1/players/3

现在,当我访问/teams url时,它在TeamsCtrl内运行一个函数,它加载所有数据,然后我可以转到每个嵌套项并查看所有数据。它工作正常。

但是,如果我直接转到像/teams/1这样的团队网址,或者像/teams/1/players/2这样的玩家网址,则该功能无法运行,因为它不存在,也不在{ {1}} TeamCtrl中{0}}现在都没有{/}}。

我觉得每次在玩家或团队之间切换时都会运行该抓取功能是不对的。那么,如果我在层次结构中不是从顶部到底部的链接而是任意的,那么如何确保我拥有所有数据呢?

1 个答案:

答案 0 :(得分:0)

建议是创建一个包装数据结构本身的服务,并在服务上包含检索每个级别所需数据集的方法。

创建后,将服务注入每个控制器。另外一点是你只加载一次数据。

服务的角度文档非常好。可能看起来像这样。

teamDataService.factory('TeamData', ['$resource', function($resource){

// retrieve data from api call of some sort
var tdr = $resource('/path/to/data/service');

var data;


  teamdata = tdr.get(function(){
     data = teamdata; // assuming your api call returns an array of JSON objects.
  };

return {
   teams: function(){
      return data;
   };

   team: function(id){
        return data[id];
   };

   player: function(teamid, playerid){
       return data[teamid].players[playerid];
   };
}

}]);


myApp.controller('teamController', ['$scope', 'TeamData', function($scope, TeamData){

 var Player1 = TeamData.player(1, 1);


}]);