Angular / Ionic Chat示例?

时间:2015-07-03 13:16:56

标签: json angularjs ionic

我正在尝试在默认的Ionic模板(标签)中执行相同的示例。如果您有一个名为聊天的标签,其中包含大量带有说明的图片,当您点击列表中的其中一个项目时,您将获得更多详细信息。并且所有这些都是使用预定义的数组(硬编码)完成的。

在我的情况下,我试图做同样的事情但是使用一个json数组来保存来自远程数据库的值。我在service.js文件中定义 factory 来执行此操作。但是,因为我使用 $ http 调用异步请求,所以返回的json数组不会立即保存值(它需要时间),这会导致从工厂返回的数组为空

我的工厂如下:

.factory('GCs', ['$http', function($http) {
    // this is the var that I want to pass to get method
    //but it will be empty because the get method in the return section will be executed before the call finished.
    var obj = {};

    $http.post("mydomina.com?myrequest=getbyid", {
            "id": "1"
        })
        .success(function(data) {
            obj = data; //there is a data returned correctly from the db
        })
        .error(function(data, status, headers, config) {
            //TODO something..
        });

    console.log(obj); //obj is undefined?

    return {
        all: function() {
            return obj; //obj is empty here!!
        },
        get: function(gcId) {
            for (var i = 0; i < gcs.length; i++) {
                if (gcs[i].id === parseInt(gcId)) {
                    return gcs[i];
                }
            }
            return null;
        }
    };
}]);

然后在控制器文件中,我有自己的控制器,为all / get方法调用此工厂,如下所示。

.controller('DashCtrl', function($scope, GCs) {
    console.log(GCs.all());// it is giving me undefined 
    $scope.GCResult = GCs.all(); //GCResult is empty and thereby no data will be displayed when I pass the scope to the view.
})

.controller('GCDetailCtrl', function($scope, $stateParams, GCs) {
    $scope.item = GCs.get($stateParams.GC_ID);
})

我需要你的帮助。

2 个答案:

答案 0 :(得分:1)

您可以返回$http.post()生成的承诺(docs

.factory('GCs', ['$http', function($http) {
        return {
            getById: function(id) {
              return $http.post("mydomina.com?myrequest=getbyid", { "id": id });
            }
        };
}]);

并将您的控制器更改为

.controller('DashCtrl', function($scope, GCs) {

    $scope.getData = function(id){
        GCs.getData(id)
            .success(function(data){
                console.log(data);
                $scope.GCResult = data; 
            });
    };
})

它应该可以正常工作

答案 1 :(得分:0)

$http返回的承诺无法直接绑定:

.factory('GCs', ['$http', function($http) {
  return {
    all: function() {
      return $http.post("mydomina.com?myrequest=getbyid", { "id": "1"} );
    }
  };
}]);

在Angular 1.2中,自动解除承诺被删除。请参阅http://docs.angularjs.org/guide/migration#templates-no-longer-automatically-unwrap-promises