установка элементов области видимости после вызова http в angularjs

0

Я новичок в AngularJs. Я вызываю вызов http get, чтобы получить список имен, и я хочу его, как только приложение загрузится. Поэтому я написал логику, чтобы получить список имен в функции run на angularjs. Я использую настраиваемую service для извлечения имен и вызова функции внутри метода run.

Код в методе службы выглядит следующим образом:

angular.module('myApp')
  .service('fetchData', function ($http, $rootScope) {
    // AngularJS will instantiate a singleton by calling "new" on this function
    this.fetchNames = function() {
      $http.get('http://hostname:port/names').success(function (person) {
          $rootScope.names = person.names;
      });
  }

В моем app.js у меня есть код, как показано ниже:

angular.module('myApp', ['ngRoute'])
.config(function ($routeProvider, $locationProvider) {
  $routeProvider
      .otherwise({
        redirectTo: '/'
      });

  $locationProvider.html5Mode(true);
})

.run (function($rootScope, fetchData){
    //first make an ajax call and fetch all the applicatons for the given BU
    fetchData.fetchNames();
});

Но по имени fetchNames имена образуют HTTP-вызов, метод выполнения уже выполнен.

Пожалуйста, дайте мне знать, где я ошибаюсь.

  • 0
    Поскольку ajax-запрос является асинхронным вызовом, функция run не ожидает завершения запроса. Кстати, в чем проблема?
  • 0
    Я хочу использовать атрибуты, установленные для rootScope, в моем методе run но, поскольку это асинхронный режим, я не получаю значение в функции run .
Показать ещё 2 комментария
Теги:
angularjs-scope
angularjs-service

1 ответ

0

В вашем сервисе вы можете вернуть обещание, а затем справиться с успехом в своей функции запуска.

angular.module('myApp')
  .service('fetchData', function ($http, $rootScope) {
    // AngularJS will instantiate a singleton by calling "new" on this function
    this.fetchNames = function() {
      return $http.get('http://hostname:port/names');
  }

Теперь вы можете обработать событие успеха в режиме run.

.run (['$rootScope', 'fetchData', function($rootScope, fetchData){
    //first make an ajax call and fetch all the applicatons for the given BU
    fetchData.fetchNames().success(function (person) {
          $rootScope.names = person.names;
    );
}]);
  • 0
    Понял. Происходит это путь, так как это асинхронный вызов. Но так как я использую пользовательскую директиву для отображения имен и что эта пользовательская директива имеет изолированную область видимости, то как сделать имена доступными для области действия внутри директивы. Я имею в виду, что к тому времени имена будут установлены внутри функции run , директива была бы вызвана. Каков наилучший способ сделать имена доступными для директивы.
  • 0
    @Pradeep Вы можете использовать двухстороннее связывание и передавать имена в директиву. Как только имена будут обновлены с помощью вызова ajax, они будут отражены в переменной директивы, к которой вы привязали имена.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню