2015-10-17 2 views
0

В моем шаблоне, у меня есть следующий код: <a ng-click="countryDetail(country.id)" style="cursor:pointer">{{country.name}}</a>

В моем нг-контроллер у меня есть этот код для извлечения данных из таблицы страны в моей БД:

$scope.countryDetail= function (id) { 
     if (!id) return; 
     Country.countryDetail(id) 
     .then(function (data) { 
      $scope.loadedCountry = Country.loadedCountry ; 
      console.log($scope.loadedCountry); 
      $state.go('country.detail', { 'countryId': id }); 
     }); 
    }; 

My service : 

    countryService.countryDetail = function (id) { 
     var deferred = $q.defer(); 
     return $http.get(countryUrl + "detail/" + id) 
      .success(function (data) { 
       deferred.resolve(
         countryService.loadedCountry = data); 
      }) 
     .error(function (error) { 
      deferred.reject(error); 
     }) 
     return deferred.promise; 
    } 

состояния в моем app.js

.state('country.detail', { 
       url: '^/country/detail/{countryId:[0-9]{1,6}}', 
       templateUrl: 'app/country/countryDetail.html', 
       controller: 'countryCtrl' 
      }) 

Когда я нажмите на ссылку названия страны, консоль показывает объект страны с хорошими значениями, но шаблон country.detail имеет нулевой объект страны. Когда я добавил $scope.countryDetail() после моей функции, данные отображаются в шаблоне детали, но на сервере есть 2 вызова! Итак, как можно использовать только один вызов без повторного вызова $scope.countryDetail()?. Thanks

+1

Похоже, что вы делаете '$ http' запрос в неправильный контроллер. Подумайте о том, чтобы сделать это в 'resolve'' country.detail' или из контроллера 'country.detail' – charlietfl

+0

Запрос $ http находится в моей службе. Посмотрите мой первый вопрос, я добавил обновление – user708683

+1

Правильно, но вы не хотите делать этот запрос перед изменением маршрутов.вы попадаете в данные с неправильной областью контроллера. – charlietfl

ответ

2

OK. Позвольте мне объяснить, что вы делаете:

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

Это может работа, потому что, когда вы переходите в другое состояние, область действия текущего контроллера исчезает: создается новая область и создается новый контроллер.

Итак, что вы должны сделать вместо этого

  • нажмите на ссылку, чтобы отобразить страну
  • перейти в другое состояние, которое сконфигурировано для использования другого контроллера: CountryDetailController
  • в CountryDetailController, получить подробную информацию о стране с сервера и сохранить ее в области

Тогда это будет работать: детали страны будут сохранены в правильном объеме, а вид t новое состояние отобразит его.

Другой вариант: использовать параметр resolve конфигурации состояния (это описано в документации, так что происходит следующее:

  • нажмите на ссылку, чтобы отобразить страну
  • перейти в другое состояние, которое сконфигурирован для использования другого контроллера: CountryDetailController
  • ui router вызывает функцию разрешения, которая возвращает обещание детали страны. Ожидает, пока страна не будет доступна
  • , когда страна доступна BLE, маршрутизатор конкретизирует CountryDetailController и впрыскивает саму страну
  • в CountryDetailController, получить впрыскивается деталь страны из аргументов функции и хранить его в объеме
+0

А это лучше :) Я попробую это и дам вам знать, спасибо! – user708683

+0

Первый вариант работает для меня. Я хотел избежать использования другого контроллера, но я думаю, что у меня нет выбора. Спасибо, сэр. – user708683

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