我有以下控制器:
.controller('GitCtrl', function ($scope, $http, Chats) {
$scope.search = function () {
$id = 1;
$scope.repos = Chats.all($http);
$scope.repos2 = Chats.get($id);
}
})
单击调用搜索功能的按钮时,唯一不起作用的是Chats.all,它来自以下服务(以及Chats.get):
.factory('Chats', function ($http) {
var chats = [{
id: 0,
name: 'Ben Sparrow',
lastText: 'You on your way?',
face: 'img/ben.png'
}, {
id: 1,
name: 'Max Lynx',
lastText: 'Hey, it\'s me',
face: 'img/max.png'
}];
return {
all: function () {
var user = $('#gitdata-input').val();
$http.get("https://api.github.com/users/" + user + '/repos').then(function (resp) {
console.log('Success', resp);
var repos = resp.data;
return repos;
}, function (err) {
console.error('ERR', err);
})
},
get: function(chatId) {
for (var i = 0; i < chats.length; i++) {
if (chats[i].id === parseInt(chatId)) {
return chats[i];
}
}
return null;
}
};
});
Chats.get和聊天数组仅用于测试目的。
我已经验证该服务有效,因为我'Succes'被记录到我的控制台,我也看到ver repos包含我的数据。但是,在控制器中,$scope.repos
保持未定义。 $scope.repos2
确实有效。
然后我在控制台中注意到来自服务的Chats.all函数(我有一个断点)被调用后,$ scope.repos2已经填充了Chats.get的结果。那么为什么呢?还有什么原因导致我无法从Chats.All中获取数据?在我的控制器中?
答案 0 :(得分:1)
当 Chats.get()和 Chats.remove()是同步的时,函数 Chats.all()是异步的,因为它包含一个http调用,因此当你这样做:
$scope.repos = Chats.all($http);
您基本上返回未定义。 我建议您使用promises,因此将 Chats.all()代码更改为:
all: function () {
return $q(function(resolve,reject) {
var user = $('#gitdata-input').val();
$http.get("https://api.github.com/users/" + user + '/repos').then(function (resp) {
console.log('Success', resp);
resolve(resp.data);
}, function (err) {
reject(err);
});
}
},
控制器中的行如下:
Chats.all($http).then(function(data) {$scope.repos = data;});
干杯!
答案 1 :(得分:1)