在Cordova Angular Ionic应用程序中没有在控制器中接收数据

时间:2016-03-15 14:48:53

标签: 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,它来自以下服务(以及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中获取数据?在我的控制器中?

2 个答案:

答案 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)

接受的答案是不好的做法,应尽可能避免。

有角度的Worksheet_Change调用正在返回一个承诺,不应该包含在另一个承诺($ q)中。只需返回$http调用本身的承诺就足够了。

简而言之:

$http

应该做的伎俩。 (参见plunker)并且确实要了解为什么应该避免在承诺中包装承诺here