我正在尝试在默认的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);
})
我需要你的帮助。
答案 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。