Я создаю приложение, которое получает простой массив с видео-ссылками YouTube, а также некоторые другие данные. Я создаю несколько html
элементов DOM, используя ng-repeat
. На каждой итерации ретранслятора мне нужно вызвать функцию и передать текущую ссылку на YouTube. Этот вызов функции передает ссылку на бэкэнд для дальнейшего процесса и в конечном итоге возвращает объект в следующем формате:
var obj = {
duration: "1H34M45S",
more_data:{
title: "some title",
height: "200px",
width: "100px",
date_posted: "oct 2, 1734"
}
}
Очевидно, что моя текущая реализация не работает (бесконечный цикл). Каков правильный способ приема и использования данных во время ng-repeat
?
HTML:
<div class="row" ng-repeat="vid in videosArray">
<div class="col-lg-12 col-md-12 col-sm-12">
<iframe ng-src="{{trustSrc(vid.url)}}" width="300" height="200" frameborder="0" allowfullscreen></iframe>
<p>{{getVideoInfo(vid.url)}}</p> <!--here I need to acces the returned object and use the data. for example place the title / duration here -->
</div>
</div>
JS:
$scope.getVideoInfo = function(videoUrl) {
$http({
url: "youtubeInfo.php",
method: "POST",
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
data: $.param({getInfo: videoUrl})
}).success(function(data, status, headers, config) {
console.log(data);
return data; //data is an object
}).error(function(data, status, headers, config) {});
}
edit
: Это ошибки, которые я получаю в консоли:
<b>Notice</b>: Undefined offset: 1 in <b>C:\xampp\htdocs\controllers\youtubeInfo.php</b> on line <b>22</b><br />
{"duration":{"kind":"youtube#videoListResponse","etag":"\"q5k97EMVGxODeKcDgp8gnMu79wM\/Rk41fm-2TD0VG1yv0-bkUvcBi9s\"","pageInfo":{"totalResults":0,"resultsPerPage":0},"items":[]},"vid_data":null}
https://docs.angularjs.org/error/$rootScope/infdig?p0=10&p1=%5B%5D
edit2
- даже если я изменяю функцию JS для возврата данных через $scope
, я все равно получаю ошибку выше в бесконечном цикле.
}).success(function(data, status, headers, config) {
console.log(data);
$scope.test = data;
}).error(function(data, status, headers, config) { });
HTML:
<div class="col-lg-12">
<iframe ng-src="{{trustSrc(vid.url)}}" width="300" height="200" frameborder="0" allowfullscreen></iframe>
<p>{{getVideoInfo(vid.url)}}</p><span>{{test.duration}}</span>
</div>
Я рекомендую использовать $ resource здесь, потому что он возвращает объект, который заполняется после завершения запроса и поэтому может быть легко использован в вашем шаблоне.
https://docs.angularjs.org/api/ngResource/service/ $ resource
Таким образом, вы должны в конечном итоге с sth, как это (не тестировалось):
var VideoInfo = $resource('youtubeInfo.php', null, { 'get': {method:'POST'} }); // BTW: Think about if this request needs POST as method...
$scope.getVideoInfo = function(videoUrl) {
return VideoInfo.get({getInfo: videoUrl}, function(value, responseHeaders) {
// Do some logging or whatever...
});
}
В шаблоне вы должны использовать ng-init для выполнения запроса один раз, а затем использовать объект по своему усмотрению.
<div class="row" ng-repeat="vid in videosArray" ng-init="videoInfo = getVideoInfo(vid.url)">
<div class="col-lg-12 col-md-12 col-sm-12">
<iframe ng-src="{{trustSrc(vid.url)}}" width="300" height="200" frameborder="0" allowfullscreen></iframe>
<p>{{videoInfo.title}} {{videoInfo.duration}}</p>
</div>
обещание не возвращает значение данных, вместо этого вы должны делать assingment в успехе
function(videoUrl) {
$http({
url: "youtubeInfo.php",
method: "POST",
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
data: $.param({getInfo: videoUrl})
}).success(function(data, status, headers, config) {
console.log(data);
$scope.getVideoInfo = data; //data is an object
}).error(function(data, status, headers, config) {});
}
promise don't return data value
?
Попробуйте использовать это
{{getVideoInfo(vid.url).duration}}