2017-10-24 8 views
0

바보 같은 축구 응용 프로그램을 만들고 있습니다. 첫 번째 페이지에서, 나는 국가의 상위 부문 순위와 다음주의 경기를로드하려고 노력하고있다.

RESTful 웹 서비스를 사용하여 데이터를 검색하므로 비동기식으로이 수행됩니다. 테이블은 괜찮지 만 조명기는 아닙니다.

'matchday'및 'status'속성이있는 조명기 객체의 배열이 있습니다. 'this.getFixtures'함수를 살펴 본다면 성공 코드 블록을 살펴보십시오. 내가하려고하는 것은 특정 경기의 날에만 조명기를 표시하는 것입니다. 매치 데이에 경기가 남아있는 경기가 하나 있다면 그 경기가 표시되기를 바랍니다. 그렇지 않은 경우 다음 경기의 경기를 표시합니다.

'status'속성의 값은 일반적으로 'SCHEDULED'또는 'FINISHED'입니다. 성공 코드 블록에서 나는 다음과 같이 말하고있다 :

Loop Through 모든 조명기를 검색한다. 이 조명기가 예정되어 있다면, 우리는이 조명기의 성냥갑에 있습니다. 그런 경우 브레이크 루프.

그런 다음 get 메소드 외부에서 해당 값을 사용하려하지만 계속 정의되지 않습니다. 성공 블록 밖에서 그 값에 접근 할 수있는 방법이 있습니까?

$ scope.matchDay 함수를 필터로 사용합니다. 그러면 ng-repeat와 함께 해당 경기에 예약 된 조명기 만 표시하는 데 도움이됩니다.

어쨌든, 긴 호흡이 게시물에 대한 죄송하지만 여기 코드는 다음과 같습니다

HTML

: 나는이 문제를 지금까지 볼 수

<div class="grid-x"> 
<div class="medium-8 medium-offset-2 cell"> 
    <div id="premier-league-banner"> 
     <div class="banner-shade"> 
      <div class="grid-x"> 
       <div class="medium-5 cell"> 
        <table> 
         <tr ng-repeat="team in premierLeagueTable.standing | limitTo: 6"> 
          <th>{{ $index + 1 }}</th> 
          <td><img class="prem-thumbnail" src="{{ team.crestURI }}" /></td> 
          <th>{{ team.teamName }}</th> 
          <th>{{ team.playedGames }}</th> 
          <th>{{ team.goalDifference }}</th> 
          <th>{{ team.points }}</th> 
         </tr> 
        </table> 
       </div> 
       <div class="medium-2 cell"> 
        <img src="images/prem-logo.png" /> 
       </div> 
       <div class="medium-5 cell"> 
        <table> 
         <tr ng-repeat="fixture in premierLeagueFixtures.fixtures | filter:{matchday: 10}"> 
          <th>{{fixture.homeTeamName}}</th> 
          <td>vs</td> 
          <th>{{fixture.awayTeamName}}</th> 
         </tr> 
        </table> 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 

각도 JS

// MODULE 
var quickEleven = angular.module('quickEleven', ['ngRoute', 'ngResource']); 

// ROUTES 
quickEleven.config(function ($routeProvider) { 

    $routeProvider 

    .when('/', { 
     templateUrl: 'pages/home.htm', 
     controller: 'homeController' 
    }) 

}); 

// CONTROLLERS 
quickEleven.controller('homeController', ['$scope', '$resource', '$log', 'footballData', function($scope, $resource, $log, footballData) { 

    function getMonday(date) { 
     var day = date.getDay() || 7; 
    if(day !== 1) 
     date.setHours(-24 * (day - 1)); 
     return date; 
    } 

    function convertDate(date) { 
     var yyyy = date.getFullYear().toString(); 
     var mm = (date.getMonth()+1).toString(); 
     var dd = date.getDate().toString(); 

     var mmChars = mm.split(''); 
     var ddChars = dd.split(''); 

     return yyyy + '-' + (mmChars[1]?mm:"0"+mmChars[0]) + '-' + (ddChars[1]?dd:"0"+ddChars[0]); 
    } 



    var thisMonday = getMonday(new Date); 
    var nextMonday = getMonday(new Date); 
    nextMonday.setDate(nextMonday.getDate() + 7); 

    $log.info("Boom! " + convertDate(thisMonday)); 
    $log.info("For! " + convertDate(nextMonday)); 

    $scope.premierLeagueTable = footballData.getLeagueTable("http://api.football-data.org/v1/competitions/:competitionId/leagueTable", 445); 
    //http://api.football-data.org/v1/competitions/:competitionId/fixtures?timeFrameStart=2018-03-01&timeFrameEnd=2018-03-05 
    //"http://api.football-data.org/v1/competitions/:competitionId/fixtures/?matchday=9" 
    $scope.premierLeagueFixtures = footballData.getFixtures("http://api.football-data.org/v1/competitions/:competitionId/fixtures?timeFrameStart=" + convertDate(thisMonday) + "&timeFrameEnd=" + convertDate(nextMonday), 445); 
    $log.info($scope.premierLeagueFixtures); 
    $log.info($scope.premierLeagueTable); 

    $scope.matchdayValue = 9; 

    $scope.matchDay = function() { 
     return footballData.getMatchday(); 
    }; 

}]); 


quickEleven.service('footballData', ['$resource', '$log', function($resource, $log) { 

    //Referring to the latest matchday with the status as 'SCHEDULED' 
    var self = this; 
    var test; 
    self.latestScheduledMatchday = 0; 

    self.getMatchday = function() { 
     $log.info("This is: " + test); 
     return self.latestScheduledMatchday; 
    } 

    this.getLeagueTable = function (footballUrl, compId) { 
     this.footballAPI = 
      $resource(footballUrl, {}, {  
       get: { 
        method: "GET", 
         headers: { 
          "X-Auth-Token": "f73808b698e84dccbe4886da3ea6e755" 
         } 
       } 
      }) 

      .get({ 
       competitionId: compId 
      }, function(data) { 
       this.fussball = data; 
      }, function(err) { 
       $log.error(err); 
      }); 

     return this.footballAPI; 
    }; 



    this.getFixtures = function (footballUrl, compId) { 
    //  var self; 
     this.footballAPI = 
      $resource(footballUrl, {}, {  
       get: { 
        method: "GET", 
         headers: { 
          "X-Auth-Token": "f73808b698e84dccbe4886da3ea6e755" 
         } 
       } 
      }) 

      .get({ 
       competitionId: compId 
      }, function(data) { 
//    self = data.fixtures; 
       self.latestScheduledMatchday = data.fixtures[0].matchday 
       for (var i = 0; i < data.fixtures.length; i++) { 
        var fixture = data.fixtures[i]; 

        if (fixture.status == 'SCHEDULED') { 
         test = fixture.matchday; 
         break; 
        } 
       } 
       $log.info("Dollar signs... " + test); 
      }, function(err) { 
       $log.error(err); 
      }); 

     return this.footballAPI; 
    }; 
}]); 

답변

1

. 정의되지 않은 값을 기록한 것은 서비스가 제대로 구현되지 않을 수 있다는 것입니다. AFAIK 함수를 "function ($ resource, $ log) {"함수로 반환해야합니다. 여기

은 (주 내가 이것을 테스트하지했습니다)

quickEleven.service('footballData', ['$resource', '$log', function($resource, $log) { 

    //Referring to the latest matchday with the status as 'SCHEDULED' 
    var wrappedService = {}; 
    var test; 
    var latestScheduledMatchday = 0; 

    var getMatchday = function() { 
     $log.info("This is: " + test); 
     return latestScheduledMatchday; 
    } 

    wrappedService.getLeagueTable = function (footballUrl, compId) { 
     wrappedService.footballAPI = 
      $resource(footballUrl, {}, {  
       get: { 
        method: "GET", 
         headers: { 
          "X-Auth-Token": "f73808b698e84dccbe4886da3ea6e755" 
         } 
       } 
      }) 

      .get({ 
       competitionId: compId 
      }, function(data) { 
       wrappedService.fussball = data; 
      }, function(err) { 
       $log.error(err); 
      }); 

     return wrappedService.footballAPI; 
    }; 



    wrappedService.getFixtures = function (footballUrl, compId) { 
     wrappedService.footballAPI = 
      $resource(footballUrl, {}, {  
       get: { 
        method: "GET", 
         headers: { 
          "X-Auth-Token": "f73808b698e84dccbe4886da3ea6e755" 
         } 
       } 
      }) 

      .get({ 
       competitionId: compId 
      }, function(data) { 
       latestScheduledMatchday = data.fixtures[0].matchday 
       for (var i = 0; i < data.fixtures.length; i++) { 
        var fixture = data.fixtures[i]; 

        if (fixture.status == 'SCHEDULED') { 
         test = fixture.matchday; 
         break; 
        } 
       } 
       $log.info("Dollar signs... " + test); 
      }, function(err) { 
       $log.error(err); 
      }); 

     return wrappedService.footballAPI; 
    }; 
    return wrappedService; 
}]); 

그래서 대신에 어떤 서비스를 반환하지 않는 함수를 내가 그것을 바꿀 것입니다 방법, 당신은 당신이 의도 된 생각으로 서비스가 싸서 돌아왔다. 나는 또한 당신의 의도 (내부 서비스 변수)가 함수에서 var scoping으로 더욱 능숙하게 다루어지기 때문에 "self"에 대한 참조를 제거했다.

서비스가 작동하면 볼 수있는 두 번째 문제입니다.

$scope.premierLeagueTable = footballData.getLeagueTable("http://api.football-data.org/v1/competitions/:competitionId/leagueTable", 445); 

이 줄은 요청 데이터를 반환하지 않지만 요청 개체를 반환합니다. 사실 $ scope.premierLeagueTable이 설정 될 때까지 요청은 아직 완료되지 않았습니다. 콜백 함수를 넣을 수있는 약속에 액세스 할 수 있습니다. 자세한 내용은 각도 리소스 설명서를 참조하십시오. 구체적으로 세 번째 예제는 사용자 리소스 섹션에 있습니다. $ promise https://docs.angularjs.org/api/ngResource/service/ $ resource # user-resource .

데이터 반환을 적용하려는 기능이 무엇이든 그 안에 들어 있어야합니다. $ promise.then (...) 콜백. 거기에 약속이 응답 데이터 또는 콜백 반환을 받는지 확실하지 않습니다. 그것을 찾으려면 추가로 읽거나 실험해야합니다.