2016-08-01 1 views
-2

Я использую Angular 1.5.anguar 1.5 данные доступа в http.get без области действия

Я не могу получить доступ к своим данным, с http.get, из http.get. Поясню:

У меня есть компонент:

(function(){ 
'use strict'; 
class myComponent { 
    constructor(
     $http, 
     $scope) 
    { 
     var self = this; 
     self.test="this is a test"; 
     $http.get(MYAPI).then(function(response){ 
     self.MYDATA = response.data; 
     console.log(self.MYDATA) 
     }); 
     console.log(self.test) 
     console.log(self.MYDATA) 
    } 

} 
angular.module('myApp') 
.component('myApp.test', { 
    templateUrl: 'myTemplate.html', 
    controller: myComponent, 
    controllerAs:'vm', 
}); 
})(); 

console.log дают мне:

это тест -> для испытания

неопределенному -> out http.get

Объект {id: 1 ...} -> в http.get

Так что я не могу получить доступ к своим данным из http.get, и это то, что я хочу.

Есть ли у кого-нибудь идее? Спасибо.

+0

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

+0

Правильно, я не заметил, спасибо. И у вас есть ключ к использованию данных в контроллере? – Wandrille

ответ

0

$http.get - это асинхронный вызов, означающий, что выполнение программы не дожидается получения данных с сервера.

Таким образом, к моменту, когда console.log(self.MYDATA) находится за пределами $http.get(), данные не были получены с сервера, поэтому вы получаете undefined error.

Чтобы решить эту проблему, или для обработки асинхронных вызовов, вы могли бы сделать что-то вроде этого:

var promise = $http.get(MYAPI); 

затем доступ к данным в следующем порядке с помощью обратных вызовов:

promise.then(
      function successCallBack(response) 
       { 
        self.MYDATA = response.data; 
        console.log(self.MYDATA) 
       } 
      ).then(
       function errorCallBack(response) 
       { 
        console.log(response); 
       }   
      ); 

Вот хорошая статья на callbacks, которая может вам помочь!

+0

Это работает, спасибо. Но я не знаю, почему, я не могу иметь его в дочернем компоненте. Я могу иметь доступ к self.test в дочернем контроллере, но не self.MYDATA. Но, возможно, этот вопрос не связан. Должен ли я отправить обещание ребенку, а затем выполнить обещание. Затем(), это работает, но не очень приятно. Или можно напрямую отправлять данные с самого себя. MYDATA? – Wandrille

+0

Вы можете объявить обетование переменной 'global', а затем вы можете получить доступ к« отклику »во всем скрипте с помощью обратных вызовов ИЛИ вместо дочернего компонента, вы можете создать службу, а затем отправить« ответ »в качестве аргумента для этого службы. Это будет работать, поскольку вызовы службы синхронны. – varunsinghal65

+0

Спасибо. Это помогло мне – Wandrille