AngularJS добавление к объекту JSON после вызова $http
У меня есть множество прозвищ стримеров twitch. Теперь я хочу вызвать их API для получения данных о канале и добавить его к исходному объекту JSON, чтобы работать с ним на интерфейсе моего решения.
Теперь, когда я утешаю.я получаю результаты в виде объекта, записанного в консоль, но я не могу понять, почему он не добавляет его к исходному массиву потоков и не показывает его в моем html.
Любая помощь ценится
Мой html:
<div ng-app="twitchAPI" ng-controller="streamController">
{{ error }}
<div>
{{ streams }}
</div>
</div>
Мое приложение:
var twitchAPI = angular.module('twitchAPI', []);
twitchAPI.controller('streamController', function($scope, $http) {
$scope.streams = [{
'nick': 'freecodecamp'
}, {
'nick': 'storbeck'
}, {
'nick': 'terakilobyte'
}, {
'nick': 'habathcx'
}, {
'nick': 'RobotCaleb'
}, {
'nick': 'thomasballinger'
}, {
'nick': 'noobs2ninjas'
}, {
'nick': 'beohoff'
}, {
'nick': 'brunofin'
}, {
'nick': 'comster404'
}, {
'nick': 'RiotGamesBrazil'
}];
var onInfoReceived = function(response) {
return response.data;
}
var onInfoError = function(reason) {
$scope.error = "Could not fetch the information!"
}
var getStreamInfo = function(nick) {
$http.jsonp('https://api.twitch.tv/kraken/channels/' + nick + '?callback=JSON_CALLBACK')
.then(onInfoReceived, onInfoError);
}
for (var x in $scope.streams) {
$scope.streams[x].nick.channelInfo = getStreamInfo($scope.streams[x].nick);
};
});
Я также создал codepen этой вещи, так как это упражнение freeCodeCamp.
2 ответа:
Первое, что вы должны вернуть обещание из метода
getStreamInfo
, чтобы вы могли реализовать цепочку обещаний над ним. Затем следуйтеIIFE
, чтобы ограничить область действия объекта$scope.streams[x]
при работе с асинхронным вызовом в цикле.Код
var getStreamInfo = function(nick) { return $http.jsonp('https://api.twitch.tv/kraken/channels/' + nick + '?callback=JSON_CALLBACK') .then(onInfoReceived, onInfoError); } for (var x in $scope.streams) { (function(stream){ getStreamInfo(stream.nick).then(function(data){ stream.channelInfo = data }); })($scope.streams[x]) };
Edit
Также добавьте СВОЙСТВО
channelInfo
в каждый объект вместо добавления его внутри свойстваnick
каждого объекта, как предложил @ThomasIllingworth.
Это не удается, потому что вы пытаетесь получить доступ к атрибуту.channelInfo строки. Вам нужно отредактировать массив, чтобы создать объекты, к которым вы можете добавить атрибут. Что-то вроде этого:
$scope.streams = [{ nick: { shortname: 'freecodecamp', } }, { nick: { shortname: 'storbeck', } }];