Angularjs Cordova应用程序中的控制器未接收数据
我有以下控制器:Angularjs Cordova应用程序中的控制器未接收数据,angularjs,cordova,ionic-framework,Angularjs,Cordova,Ionic Framework,我有以下控制器: .controller('GitCtrl', function ($scope, $http, Chats) { $scope.search = function () { $id = 1; $scope.repos = Chats.all($http); $scope.repos2 = Chats.get($id); } }) 当我单击调用搜索功能的按钮时,唯一不起作用的是Chats.all,它来自以下服务(以
.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',函数($http){
变量聊天=[{
id:0,
名字:'本斯派洛',
lastText:“你在路上吗?”,
脸:“img/ben.png”
}, {
id:1,
名称:“Max Lynx”,
lastText:'嘿,是我',
面:“img/max.png”
}];
返回{
全部:函数(){
var user=$('#gitdata input').val();
$http.get(“https://api.github.com/users/“+user+'/repos')。然后(函数(resp){
console.log('Success',resp);
var repos=相应数据;
回购回报;
},函数(err){
console.error('ERR',ERR);
})
},
获取:函数(chatId){
for(var i=0;i
Chats.get和Chats数组仅用于测试目的。我已经验证了该服务是否有效,因为我“成功”登录到我的控制台,并且我还看到ver repos包含我的数据。但是,在控制器中,
$scope.repos
保持未定义状态<代码>$scope.repos2不起作用然后我在控制台中注意到,在$scope.repos2已经被Chats.get的结果填充之后,调用了服务中的Chats.all函数(我在其中有一个断点)。为什么会这样?这也是导致我无法从聊天室接收数据的原因吗?全部在我的控制器中?而聊天室。get()和聊天室。remove()是同步的,函数聊天室。All()是异步的,因为它包含一个http调用,因此当您执行以下操作时:
$scope.repos = Chats.all($http);
您基本上返回了未定义的。
我建议您使用承诺,因此将您的聊天。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;});
干杯 虽然Chats.get()和Chats.remove()是同步的,但函数Chats.all()是异步的,因为它包含一个http调用,因此执行以下操作时:
$scope.repos = Chats.all($http);
您基本上返回了未定义的。
我建议您使用承诺,因此将您的聊天。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;});
干杯 公认的答案是错误的做法,应尽可能避免 一个有角度的
$http
调用正在返回一个承诺,不应该被包装在另一个承诺($q)中。只要返回$http
调用本身的承诺就足够了
简言之:
app.factory('Chats', function($http) {
return {
all: function(user) {
return $http.get("https://api.github.com/users/" + user + "/repos")
.then(function(resp) {
return resp.data;
}, function(err) {
console.log('ERR', err);
});
}
};
});
我们应该做到这一点。(请参阅)并且一定要阅读为什么应该避免在承诺中包装承诺。公认的答案是错误的做法,应该尽可能避免 一个有角度的
$http
调用正在返回一个承诺,不应该被包装在另一个承诺($q)中。只要返回$http
调用本身的承诺就足够了
简言之:
app.factory('Chats', function($http) {
return {
all: function(user) {
return $http.get("https://api.github.com/users/" + user + "/repos")
.then(function(resp) {
return resp.data;
}, function(err) {
console.log('ERR', err);
});
}
};
});
我们应该做到这一点。(请参阅)一定要阅读为什么应该避免在承诺中包装承诺。感谢您的解释!我理解异步调用的逻辑,但是$q变量的作用是什么,我应该在哪里定义它?这是可行的,但也被称为延迟反模式。你在用承诺来包装承诺。请参阅:详细解释。感谢您的解释!我理解异步调用的逻辑,但是$q变量的作用是什么,我应该在哪里定义它?这是可行的,但也被称为延迟反模式。你在用承诺来包装承诺。请参阅:以获取详细的解释。