0

В моем контроллере я называю завод, который возвращает объект JSON, как например:

function getData() { 
    trainDataFactory.getData() 
     .success(function (data) { 
      $scope.dataList = data; 
     }) 
     .error(function (error) { 
      $scope.status = 'Unable to load data: ' + error.message; 
     }); 
} 

И тогда я в состоянии получить доступ к $ scope.dataList в представлении, как так (который работает):

{{ dataList[0].UnitNumber }} 

Но я хочу получить доступ к этой же переменной в контроллере, однако это не сработает - угловые просто ломаются.

Я стараюсь это в начале контроллера:

init(); 
function init() { 
    getData(); 

    console.log($scope.dataList[0].UnitNumber); 

    $scope.firstDataListItem = $scope.dataList[0].UnitNumber; 
} 

GetData() вызывается, так что я не понимаю, почему $ scope.dataList недоступна ??

+0

Вы можете разместить весь контроллер? Вероятно, вы делаете что-то неправильно с включением элемента $ scope и достигаете метода getData() из внутренней области контроллера. – downhand

ответ

3

Поиск данных в getData() собирается выполнить асинхронно. Он не будет доступен в тот момент, когда getData() выполнен.

Вы должны использовать обещания:

function getData() { 
    return trainDataFactory.getData() 
    .then(function (response) { 
     return response.data; 
    }) 
    .catch(function (error) { 
     throw new Error('Unable to load data: ' + error.message); 
    }); 
} 

function init() {  
    getData().then(function (data) { 
     $scope.dataList = data; 
     console.log(data[0].UnitNumber); 
     $scope.firstDataListItem = data[0].UnitNumber; 
    }) 
    .catch(function (error) { 
     $scope.status = error.message; 
    }); 
} 
+0

Спасибо, это работает. Итак, при работе асинхронно оператор then имеет важное значение для доступа к данным непосредственно после его извлечения? – JakkyD

+0

Кроме того, означает ли это, что для использования dataList вы должны получить к нему доступ либо в getData(), либо затем (функция (данные) {} или вне функции init()? – JakkyD

+0

@JakkyD Да, обещания и метод 'then()' очень важны для асинхронных задач. Я рекомендую прочитать [эту книгу] (https://github.com/getify/You-Dont-Know-JS/tree/master/async%20%26%20performance), когда у вас есть время Я не совсем понимаю ваш второй вопрос, но, как правило, вы должны выполнять асинхронные задачи внутри 'then()' handler _somewhere_. – JLRishe

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