2014-02-18 4 views
0

Уважаемый всех, у меня возникли проблемы с объемом моего объема или как его положить.Передача данных из службы AngularJS

Я извлекаю данные из своей службы успешно, но у меня возникают проблемы с доступом к $ scope.players и $ scope.tournament, и я думаю, что это как-то связано с тем, что внутри вызова службы. Если я console.out() внутри вызова службы, все просто отлично. Как я могу получить доступ к данным, находящимся внутри служебного вызова.

Версия 1: Здесь консольный журнал просто не определен.

.controller('SelectCtrl', ['$scope','$stateParams', '$location', '$window','playerService','tournamentService', function ($scope, $stateParams, $location, $window, playerService, tournamentService) { 

    init(); 
    function init() { 

     playerService.getPlayers().then(function (data) { 
      $scope.players = []; 
      angular.forEach(data, function (player, index) { 
       $scope.players.push(player.info); 
      }); 
     }); 

     tournamentService.getTournaments().then(function (data) { 
      var result = data.filter(function (element) { 
       if (element.ID == $stateParams.id) { 
        return true; 
       } else { 
        return false; 
       } 
      }); 
      $scope.tournament = result; 
     }); 
    }; 

    console.log($scope.tournament);//undefined 
    console.log($scope.players); //undefined 
} 

Версия 2:, Здесь лог консоли просто констатирует Object {тогда: функция, загвоздка: функция, наконец: функция} который не то, что я wan't я хочу, чтобы данные были способный отобразить его на мой взгляд.

.controller('SelectCtrl', ['$scope','$stateParams', '$location', '$window','playerService','tournamentService', function ($scope, $stateParams, $location, $window, playerService, tournamentService) { 

    init(); 
    function init() { 

     $scope.players = playerService.getPlayers().then(function (data) { 
      $scope.players = []; 
      angular.forEach(data, function (player, index) { 
       $scope.players.push(player.info); 
      }); 
     }); 

     $scope.tournament = tournamentService.getTournaments().then(function (data) { 
      var result = data.filter(function (element) { 
       if (element.ID == $stateParams.id) { 
        return true; 
       } else { 
        return false; 
       } 
      }); 
      $scope.tournament = result; 
     }); 
    }; 

    console.log($scope.tournament);//Object {then: function, catch: function, finally: function} 

    console.log($scope.players);//Object {then: function, catch: function, finally: function} 

} 

Ваша помощь очень ценится!

услуг:

.factory('playerService', function ($http,$q) { 
    return { 
     getPlayers: function() { 
      //return the promise directly. 
      var deferred = $q.defer(); 
      $http.get(webServiceUrl + 'api/Player/GetAllPlayers') 
         .success(function (data) { 
          //resolve the promise as the data 
          deferred.resolve(data); 
         }).error(function() { 
          deferred.reject(); 
         }); 
      return deferred.promise; 
     } 
    } 

}) 

.factory('tournamentService', function ($http,$q) { 
    return { 
     getTournaments: function() { 
      //return the promise directly. 
      var deferred = $q.defer(); 
      $http.get(webServiceUrl + 'api/Tournament/GetAllTournaments') 
         .success(function (data) { 
          //resolve the promise as the data 
          deferred.resolve(data); 
         }).error(function() { 
          deferred.reject(); 
         }); 
      return deferred.promise; 
     } 
    } 

}) 

часть вида:

<h1 style="display: inline-block; margin-left:15px;">Enter <i>{{tournament.Name}}</i></h1> 
     <div class="row"> 
      <div class="selectinforow"> 
       <div class="col-xs-2 selectinfo"> 
        <span>{{tournament.EntryFee}}$</span></br> 
        <span>Entry Fee</span> 
       </div> 
       <div class="col-xs-2 selectinfo"> 
        <span>{{tournament.Entries}}</span></br> 
        <span>Entries</span> 
       </div> 
       <div class="col-xs-2 selectinfo"> 
        <span>{{tournament.Size}}</span></br> 
        <span>Max Size</span> 
       </div> 
       <div class="col-xs-2 selectinfo"> 
        <span>{{tournament.StartTime}}</span></br> 
        <span>Start Date</span> 
       </div> 
       <div class="col-xs-2 selectinfo"> 
        <span>{{tournament.Entryfee*tournament.Entries}}$</span></br> 
        <span>Winnings</span> 
       </div> 
      </div> 
     </div> 
+0

второй нонсенс, потому что вы просто присвоить отложенный объект переменной ... 1.version - попытаться вызвать $ объем $ применяется(); после назначения переменной (после $ scope.tournament = result;) – doodeec

+1

@doodeec вам никогда не понадобится $ scope. $ apply при работе с угловым кодом. –

+0

Вы также можете изучить функцию Resolve и выполнить всю эту обработку данных внутри вашего 'playerService'. Это действительно забивает контроллер таким образом. В идеале вы должны просто сказать «$ scope.tournament = playerService.tournament;» и т. Д. Это будет обещание по-прежнему, но угловые шаблоны понимают обещания. –

ответ

2

Так что, если вы внимательно прочитать код вы заметите, вы используете обещание на следующей строке:

tournamentService.getTournaments().then(function (data) { 
    // [your data is set here - AFTER the service call runs] 
} 

// [your print is here - run BEFORE service call runs] 

Ключ к "тогда" что он не выполняется сразу, а запускается, когда данные возвращаются из служебного вызова. Другими словами, у вас есть печать в неправильном месте - я ожидал бы, что значения там не определены. Если вы переместите операторы console.log в обещание (тогда), я ожидаю увидеть действительные значения. Вы также можете поместить точку останова в отладчике браузера, чтобы увидеть значения в функции «then», если вы хотите проверить, что все работает. Надеюсь, это ставит вас на правильный путь!

EDIT

После того, как обещание завершается, угловатый автоматически обновляет вид. Допустим, у вас есть следующие в вашей точки зрения (только пример):

<h1 ng-bind="tournament.Title">Default Text</h1> 

При загрузке вид/страницы вы увидите «Default Text». По завершении обещания, если турнир был загружен, угловое будет автоматически обновлять «h1», чтобы теперь иметь название для этого турнира. Это происходит потому, что угловой автоматически запускает «$ apply()» после того, как обещание завершено.

+0

Привет @drew_w да Я знаю, что легко распечатать (console.log) значения внутри обещания. Но тогда я не могу получить доступ к переменным/объекту в представлении. Это так же неопределенно, как console.log() вне обещания. Надеюсь, я достаточно ясно в своем комментарии. –

+0

@AKlabs Когда у вас есть отложенное обещание, угловая автоматически будет запускать $ scope. $ Apply() после завершения функции обещания. Это означает, что ваш «просмотр» должен автоматически обновляться без необходимости делать что-либо. Я обновляю свой ответ с помощью некоторого кода! –

+0

Это все еще не работает. У меня была привязка. Я также включу эти услуги. –

0

Ваш код выполнен до ответа promise.

Если вам нужно ввести код «процедурно», вы должны указатьпеременную области видимости, как показано ниже, для обнаружения любых изменений..

Например:

$scope.$watch('tournament', function() { 
console.log($scope.tournament); 
}, true); 
+0

Дорогой @Paul, это вызывает ошибку. TypeError: Невозможно прочитать свойство 'exp' undefined. Это похоже на то, что в то время, когда область видимости невидима для остальной части контроллера, что является странным, потому что моя ng-сетка может захватывать данные без проблем: S –

+1

Это должно быть '$ scope.watch ('tournament' 'вы проходите смотреть строку, которая является именем свойства, которое нужно посмотреть. –

+0

Спасибо @Jonathan Rowny Извините за ошибку;) –

Смежные вопросы