我正在使用API来搜索歌曲,但我只想通过使用angular.js中的表达式在我的html文件中显示数组中的1首歌曲。现在我遇到了一些问题,因为我想在AJAX调用和控制器中使用我的JSON对象。
(function() {
var app = angular.module('songSelector', []);
app.controller('playedTracksCtrl', function() {
// this.songs = jsonObjectPlayedTracks;
$.ajax({
url: "http://api.q-music.be/1.2/tracks/plays?limit=20",
dataType: "jsonp",
jsonp: "callback",
success: function(jsonObject){
//console.log(jsonObject);
//console.log(jsonObject["played_tracks"][0]);
var jsonObjectPlayedTracks = jsonObject["played_tracks"];
console.log(jsonObjectPlayedTracks);
}
});
});
})();
<!DOCTYPE html>
<html ng-app="songSelector">
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<link rel="stylesheet" href="css/custom.css">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<script type="text/javascript" src="js/angular.min.js"></script>
<script type="text/javascript" src="js/app.js"></script>
</head>
<body>
<header>
<h1 class="text-center">Vind info over de laatste 50 liedjes</h1>
<h2 class="text-center"> - vul in - </h2>
</header>
<div class="list-group" ng-controller="playedTracksCtrl as overzicht">
<div class="list-group-item">
<h3>{{overzicht.songs[0].title}}</h3>
</div>
</div>
<p> {{"Hello, Angular!"}} </p>
</body>
</html>
答案 0 :(得分:1)
如果您想进行ajax调用,则需要使用$http
或$resource
:
(function() {
var app = angular.module('songSelector', []);
app.controller('playedTracksCtrl', ['songService', playedTraksCtrl]);
app.service('songService', ['$http', songService])
function playedTraksCtrl(songService) {
var vm = this;
vm.songs = {};
songService.getPlays().then(function (data) {
vm.songs = data;
});
}
function songService($http){
var service = {
getPlays: getPlays
};
return service;
function getPlays(){
return $http.get('http://api.q-music.be/1.2/tracks/plays?limit=20')
.then(function (data) {
return data.data;
}).catch(function (message) {
console.log(message)
});
}
}
})();
Angular为您排序JSON。
我会把它分解:
function songService($http){
var service = {
getPlays: getPlays
};
return service;
}
这会返回一个对象:
{
getPlays: function () {}
}
我们在return service;
:
function getPlays(){
return $http.get('http://api.q-music.be/1.2/tracks/plays?limit=20')
.then(function (data) {
return data.data;
}).catch(function (message) {
console.log(message)
});
}
如您所见,此函数会立即返回另一个函数的结果:$http.get()
。结果是Promise
。 Promise
表示,当结果返回时,会关闭一个函数。
我们需要告诉Promise
我们想要在服务和控制器中做什么。所以在服务中:
.then(function (data) {
return data.data;
}).catch(function (message) {
console.log(message)
});
当.then()
解析Promise
触发此功能时,then
基本上会说。该函数有一个参数(实际上很多,但我大多数时候只关心数据)。数据上有很多属性,而我们感兴趣的是,您的API的结果是data
。所以我们所做的只是将其归还。
这个Promise
链然后在控制器中,我们可以调用另一个.then()
。当服务中的一方完成调用时,会触发此事。
songService.getPlays().then(function (data) {
vm.songs = data;
});
到目前为止,我们知道数据只是作为我们可以使用的JS对象的JSON对象。所以我们只需将它分配给vm.songs
属性。
<强>记住强>
因为呼叫是异步的,所以有Promise
,所以如果你看到一个空格,那将是因为呼叫尚未完成解析。如果是,它将调用then()
函数。