Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs Cordova应用程序中的控制器未接收数据_Angularjs_Cordova_Ionic Framework - Fatal编程技术网

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变量的作用是什么,我应该在哪里定义它?这是可行的,但也被称为延迟反模式。你在用承诺来包装承诺。请参阅:以获取详细的解释。