使用AngularJS更新多视图

使用AngularJS更新多视图,angularjs,Angularjs,我有多个模型,只有一个控制器。我的控制器处理对一个视图的更新。在这个视图中,我展示了三个部分,分别计算了玩过的游戏、排名和游戏结果。我只打了一个电话来发布游戏结果,我在数据库中得到了所有要正确更新的内容,但发布时更新的唯一视图是游戏结果。我被迫使用window.location.reload()来刷新所有内容,但这似乎不是正确的方法。我已将调用标记为/////call to REFRESH///window.location.reload() 非常感谢您的帮助 我的控制器 (function()

我有多个模型,只有一个控制器。我的控制器处理对一个视图的更新。在这个视图中,我展示了三个部分,分别计算了玩过的游戏、排名和游戏结果。我只打了一个电话来发布游戏结果,我在数据库中得到了所有要正确更新的内容,但发布时更新的唯一视图是游戏结果。我被迫使用window.location.reload()来刷新所有内容,但这似乎不是正确的方法。我已将调用标记为/////call to REFRESH///window.location.reload()

非常感谢您的帮助

我的控制器

(function(){
  angular.module('Dashboard',['Games'])
    .controller('dashboardController', ['$http', 'GameService','TournamentService', 'Stats', 'ProgressGrid', function($http,  GameService, TournamentService,Stats, ProgressGrid) {
      var vm = this;
      vm.isEditing = false;
      vm.newGame = {
        awayTeam: '',
        homeTeam: '',
        homeTeamScore: 0,
        awayTeamScore: 0
      };
      vm.showModal = function() {
        vm.isEditing = true;
      }
      vm.hideModal = function() {
        vm.isEditing = false;
        vm.addGameForm.$setPristine();
        vm.isSaving = true;
      }
      vm.addGame = function() {
        vm.isSaving = true;
        vm.newGame.id = vm.games.length + 1;
        // vm.newGame.gameDate = dateTransform(vm.newGame.gameDate);
        // get team name for notification
        vm.getTeamName = function(id) {
          return vm.teams[id-1].teamName
        }
        GameService.save(vm.newGame, function() {
          vm.addGameForm.$setPristine();


          // set var for overtime
          overtime = '';
          if(vm.newGame.hadOT == true){
            overtime = "(OT)";
          }
          if(vm.newGame.hadSO == true){
            overtime = "(SO)";
          }


          vm.games = GameService.query();
          vm.hideModal();
          ////////// CALL TO REFRESH /////////
          window.location.reload();
        })
      }
      var data = TournamentService.then(function(data) {
        vm.tournament = data.tournament
        vm.games = data.games;
        vm.hipchatroom = vm.tournament.hipchatroom;
        vm.hipchatkey = vm.tournament.hipchatkey;
        vm.teams = vm.tournament.teams
        vm.numberOfTeams = vm.teams.length;
        vm.totalGames = ((vm.numberOfTeams -1) * 2) * vm.numberOfTeams
        vm.percentGamesPlayed = (vm.games.length * 100) / vm.totalGames;
        vm.progressGrid = ProgressGrid.init(vm.numberOfTeams);
        Stats.calculateStandings(vm.games, vm.teams, vm.progressGrid);
      });

      vm.getTeamName = function(id) {
        return vm.teams[id-1].teamName
      }

    }])
    .factory('Stats', function() {
      var calc = {
        calculateStandings: function(games, teams, progressGrid) {
          var homeTeam, awayTeam, gameResult, winner, loser, ot, standings;
          _.each(games, function(game) {
            homeTeam = teams[game.homeTeam-1];
            awayTeam = teams[game.awayTeam-1];
            gameResult = {};
            winner = {};
            loser = {}
            ot = {};
            standings = [];

            ot.isOvertime = game.hadOT;
            ot.isShootout = game.hadSO;
            if( game.awayTeamScore > game.homeTeamScore ) {
              winner.team = awayTeam;
              winner.score = game.awayTeamScore;
              loser.team = homeTeam;
              loser.score = game.homeTeamScore;

            } else if ( game.awayTeamScore < game.homeTeamScore ) {
              winner.team = homeTeam;
              winner.score = game.homeTeamScore;
              loser.team = awayTeam;
              loser.score = game.awayTeamScore;
            }
            // adds game to grid
            calc.formattedResults(game, homeTeam.id,  awayTeam.id, progressGrid)
            // adds scores to team
            calc.recordGameResults(winner, loser, ot)
            // other stats
            angular.forEach(teams, function (team, index) {
              team.goalDifferential = team.goalsFor - team.goalsAgainst
              team.gamesPlayed = team.wins + team.regulationLosses + team.overtimeShootoutLosses
              team.regulationOvertimeWins = team.wins - team.shootoutWins
              team.points = team.wins * 2 + team.overtimeShootoutLosses * 1 + team.regulationLosses * 0
            });
          })
        },
        recordGameResults: function(winner, loser, ot) {
          if ( ot.isShootout || ot.isOvertime ) {
            loser.team.overtimeShootoutLosses++
          }
          else {
            loser.team.regulationLosses++
          }

          if ( ot.isShootout ) {
            winner.team.shootoutWins++
            loser.team.shootoutLosses++
          }
          winner.team.wins++
          winner.team.goalsFor += winner.score
          winner.team.goalsAgainst += loser.score

          loser.team.goalsFor += loser.score
          loser.team.goalsAgainst += winner.score
        },
        formattedResults: function(game, homeTeamID, awayTeamID, progressGrid) {
          var formattedResult = game.awayTeamScore + "-" + game.homeTeamScore + " ";
          formattedResult += game.hadSO ? '(SO)' : '' ||  game.hadOT ? '(OT)' : '';
          progressGrid[homeTeamID - 1][awayTeamID - 1] = formattedResult;
          return formattedResult

        }
      }
      return calc;
    })
    .factory('ProgressGrid', function() {
      var grid = {
        init: function(numberOfTeams) {
          var g = new Array(numberOfTeams)
          for(var i = 0; i < numberOfTeams; i++) {
            g[i] = new Array(numberOfTeams);
            for(var j = 0; j < numberOfTeams; j++) {
              g[i][j] = "";
            }
          }
          return g;
        }
      }
      return grid;
    });
}());
这就是观点

<!-- Progress Grid -->
<h3 class="">Games Played: {{ ctrl.games.length }} of {{ctrl.totalGames}} <span class="text-muted">({{ ctrl.percentGamesPlayed | number : 0 }}%)</span></h3>

<div class="table-responsive">
  <table class="table table-bordered" width="100%">
    <tr>
      <th ng-repeat="team in ctrl.teams">
        {{team.teamName}}
      </th>
      <th>&nbsp;</th>
    </tr>
    <tr ng-repeat="teamAway in ctrl.teams">
      <td ng-repeat="teamHome in ctrl.teams" ng-class="{bg: $index==$parent.$index}" width="177">
        {{ ctrl.progressGrid[teamAway.id - 1][teamHome.id - 1] }}
        <!-- <span class="text-danger">{{ teamAway.id - 1 }}, {{ teamHome.id - 1 }}</span> -->
      </td>
      <th>
        @{{teamAway.teamName}}
      </th>
    </tr>
  </table>
</div>
<!-- Team Standings -->
<h3>Standings</h3>
<div class="table-responsive">
  <table class="table table-bordered" width="100%">
    <thead>
      <tr>

        <th>Team Name</th>
        <th>Players</th>
        <th>GP</th>
        <th>W</th>
        <th>RL</th>
        <th>OSL</th>
        <th>PTS</th>
        <th>SW</th>
        <th>SL</th>
        <th>ROW</th>
        <th>GF</th>
        <th>GA</th>
        <th>GDIFF</th>
      </tr>
    </thead>
    <tbody>
      <tr ng-repeat="team in ctrl.teams | orderBy: ['-points', 'gamesPlayed', '-regulationOvertimeWins','-goalDifferential']">

        <td width="130">{{team.teamName}}</td>
        <td>{{team.player1}}<br>{{team.player2}}</td>
        <td class="statDetail">{{team.gamesPlayed}}</td>
        <td class="statDetail">{{team.wins}}</td>
        <td class="statDetail">{{team.regulationLosses}}</td>
        <td class="statDetail">{{team.overtimeShootoutLosses}}</td>
        <td class="statDetail">{{team.points}}</td>
        <td class="statDetail">{{team.shootoutWins}}</td>
        <td class="statDetail">{{team.shootoutLosses}}</td>
        <td class="statDetail">{{team.regulationOvertimeWins}}</td>
        <td class="statDetail">{{team.goalsFor}}</td>
        <td class="statDetail">{{team.goalsAgainst}}</td>
        <td class="statDetail">{{team.goalDifferential}}</td>
      </tr>
    </tbody>
  </table>
</div>

<hr>
<h1>
  Games
  <button class="btn btn-primary btn-sm" ng-show="!ctrl.isEditing" ng-click="ctrl.showModal()">Add Game</button>
</h1>
<div class="table-responsive">
  <table class="table">
    <thead>
      <th>Game #</th>
      <th>Date</th>
      <th>Final Score</th>
    </thead>
    <tbody>

      <tr ng-repeat="game in ctrl.games | orderBy: '-id'">
        <td>{{ game.id }}</td>
        <td>{{ game.gameDate | date: medium }}</td>
        <td>
          <span ng-class="{ 'winner': game.awayTeamScore > game.homeTeamScore }">{{  ctrl.getTeamName(game.awayTeam) }}</span>
          @
          <span ng-class="{ 'winner': game.homeTeamScore > game.awayTeamScore }">{{ ctrl.getTeamName(game.homeTeam) }}</span>
          <span>{{ game.awayTeamScore }} - {{game.homeTeamScore }}</span>
          <span class="label label-warning" ng-show="game.hadOT && !game.hadSO">OT</span>
          <span class="label label-danger" ng-show="game.hadSO">SO</span>

        </td>
      </tr>
      <tr ng-show="ctrl.games.length < 1 "><td colspan="3">no games played at this time.</td></tr>
    </tbody>
  </table>
</div>

<div class="modal show" ng-show="ctrl.isEditing">
  <div class="modal-dialog">
    <form  class="modal-content" name="ctrl.addGameForm" ng-submit="ctrl.addGame()">
      <div class="modal-header">
        <h2>Add Game</h2>
      </div>
      <div class="modal-body">
          <div class="container-fluid">
           <div class="form-group row">
              <label for="date">Game Date</label>
              <input type="date" class="form-control" name="gameDate" ng-model="ctrl.newGame.gameDate" required>
            </div>
            <div class="row">
              <div class="col-sm-5 well">
                <div class="form-group">
                  <label for="">Away Team</label>

                  <select name="awayTeam" class="form-control" ng-model="ctrl.newGame.awayTeam" required>
                    <option value=""></option>
                    <option ng-repeat="team in ctrl.teams" value="{{ team.id }}">{{ team.teamName }}</option>
                  </select>

                </div>
                <div class="form-group">
                  <label for="">Final Score</label>
                  <input type="number" name="awayTeamScore" class="form-control" ng-model="ctrl.newGame.awayTeamScore" required min="0"/>
                </div>
              </div>
              <div class="col-sm-2 text-center">
                @
              </div>
              <div class="col-sm-5 well">
                <div class="form-group">
                  <label for="">Home Team</label>
                  <select name="homeTeam" class="form-control" ng-model="ctrl.newGame.homeTeam" required>
                    <option value=""></option>
                    <option ng-repeat="team in ctrl.teams" value="{{ team.id }}">{{ team.teamName }}</option>
                  </select>
                </div>
                <div class="form-group">
                  <label for="">Final Score</label>
                  <input type="number" name="homeTeamScore" class="form-control" ng-model="ctrl.newGame.homeTeamScore" required min="0" />
                </div>
              </div>
            </div>
            <div class="form-group">
              <label class="checkbox">
                <input type="checkbox" name="hadOT" ng-model="ctrl.newGame.hadOT" ng-click="ctrl.newGame.hadSO = false">
                Overtime
              </label>
              <label class="checkbox">
                <input type="checkbox" name="hadSO" ng-model="ctrl.newGame.hadSO" ng-click="ctrl.newGame.hadOT = false">
                Shoot Out
              </label>
            </div>
          </div>
      </div>
      <div class="modal-footer">
        <button class="btn btn-link" type="reset" data-dismiss="modal" ng-click="ctrl.hideModal()">Cancel</button>
        <button class="btn btn-primary" type="submit" ng-disabled="(ctrl.newGame.homeTeam === ctrl.newGame.awayTeam) || (ctrl.newGame.homeTeamScore === ctrl.newGame.awayTeamScore)  || ctrl.isSaving">Add Game</button>
      </div>
    </form>
  </div>
</div>

玩的游戏:{{ctrl.Games.length}}{{ctrl.totalGames}}}({{ctrl.percentGamesPlayed}数字:0}}%)
{{team.teamName}}
{{ctrl.progressGrid[teamAway.id-1][teamHome.id-1]}
@{{teamAway.teamName}
排名
队名
球员
全科医生
W
RL
奥斯陆
临时秘书处
西南
SL
一行
女朋友
GA
GDIFF
{{team.teamName}}
{{team.player1}}
{{team.player2} {{team.gamesPlayed} {{团队获胜} {{team.regulationosses}} {{球队超时失球} {{team.points} {{team.shootouthins}} {{球队失球} {{team.regulationVertimeWINS} {{team.goalsFor}} {{团队.目标对抗} {{team.goalDifferential}
游戏 添加游戏 游戏# 日期 总分 {{game.id} {{game.gameDate}日期:中等} {{ctrl.getTeamName(game.awayTeam)} @ {{ctrl.getTeamName(game.homeTeam)} {{game.awayTeamScore}}-{{game.homeTeamScore} OT 所以 现在没有比赛。 添加游戏 比赛日期 客队 {{team.teamName} 总分 @ 主队 {{team.teamName} 总分 加班 射出 取消 添加游戏
您的服务具有作为模型和API服务的双重目的。因为您将返回这些API调用的结果,所以它将被缓存为
TournamentService
的注入值。我建议你把逻辑分开。您的服务将更好地服务于此目的,如下所示:

.service('TournamentService', ['$http','$q',function($http, $q) {
  api = {
     getTournament: function() {
        return $http.get('/tournaments/2016B', {cache: true })
            .then(function(tournament) { return tournament.data[0]})
     }
     getGames: function() {
         return $http.get('/games')
            .then(function(games){ return games.data })
     }
  }

  return api
然后,在控制器中,您可以使用
$q.all
调用服务,以聚合/按摩来自服务的数据

.controller('DashboardContoller', function(... TournamentService){
    $q.all([TournamentService.getTournnament(), TournamentService.getGames()])
    .then(function(rsps){
        vm.tournament = rsps[0]; 
        vm.games = rsps[1];
        ...
     })

我倾向于以非常精细的方式考虑服务,这样您就可以让控制器选择他们请求数据的顺序。

您的服务具有作为模型和API服务的双重目的。因为您将返回这些API调用的结果,所以它将被缓存为
TournamentService
的注入值。我建议你把逻辑分开。您的服务将更好地服务于此目的,如下所示:

.service('TournamentService', ['$http','$q',function($http, $q) {
  api = {
     getTournament: function() {
        return $http.get('/tournaments/2016B', {cache: true })
            .then(function(tournament) { return tournament.data[0]})
     }
     getGames: function() {
         return $http.get('/games')
            .then(function(games){ return games.data })
     }
  }

  return api
然后,在控制器中,您可以使用
$q.all
调用服务,以聚合/按摩来自服务的数据

.controller('DashboardContoller', function(... TournamentService){
    $q.all([TournamentService.getTournnament(), TournamentService.getGames()])
    .then(function(rsps){
        vm.tournament = rsps[0]; 
        vm.games = rsps[1];
        ...
     })


我倾向于以非常精细的方式考虑服务,这样您就可以让控制器选择他们请求数据的顺序。

您可能需要再次调用锦标赛服务,因为调用控制器刷新是不够的($route.reload()不刷新服务)你有什么建议吗?你能发布你的锦标赛服务吗?它在那个控制器里没有…我看不出锦标赛服务在哪里。然后(函数(--->你可能需要再次调用锦标赛服务,因为调用控制器刷新它不够($route.reload()不刷新服务)你有什么建议吗?你能发布你的锦标赛服务吗?它在那个控制器里没有…我看不出锦标赛服务在哪里。然后(功能)(->data jusopi,谢谢你的建议。我收到了这个错误->TournamentService.GetTournName不是一个函数如果你可以在JSIDLE或plunker上使用它,我可能会帮你解决问题。我通常用Coffeescript编写代码,所以我的原始JS可能会有点不对劲。你的小提琴坏了。我不认为它加载的角度太高方法。如果你让它运行,模板应该正确呈现,而不是所有的{{}到处都是。问题是数据是动态的,并且来自mongodb集合。用静态信息重现所有这些需要花费我很长时间。这甚至不是因为angular没有正确初始化(例如,装订破损)。我试过“摆弄”它,没有双关语,但无法启动并运行它。数据不是问题,我们可以用最简单的形式模拟假数据来解决您遇到的错误。jusopi,谢谢您的建议。我收到了这个错误->TournamentService。GetTournName不是一个函数,如果您可以抛出它的话在JSFIDLE或plunker上,我可能会用f来解决问题