所以我在服务器中有一组对象,我想在页面加载时填充ng-repeat。
我有一个工厂从服务器上的资源中获取列表,如下所示:
app.factory('objectArray', ['$http', function($http) {
// This is returning a $$state object
// instead of response.data...
return $http.post('/get_collection').then(function(response) {
console.log(response.data);
return response.data;
});
}]);
在使用ui-router和州声明中的resolve属性之前,我已经有了这段代码。但是当将这个工厂直接注入我的控制器时,而不是获得response.data,我得到一个$$状态对象。
我的控制器看起来像这样:
app.controller('applicationController', ['$scope', 'objectArray', function($scope, objectArray) {
$scope.array = objectArray;
console.log($scope.array);
}]);
答案 0 :(得分:10)
$ http服务返回的内容(因此objectArray
服务是)被称为promise。您可以通过注册回调函数来访问实际数据,该函数在数据可用时称为 ,即当对http请求的响应从服务器返回时:
objectArray.then(function(data) {
$scope.array = data;
});
使用resolve时直接访问数据的原因是路由器在resolve函数返回promise时等待promise的解析。只有这样,它才会从promise中提取数据并将数据注入控制器。
为了更好地了解承诺,您可以阅读the following article(及其sequel)。
答案 1 :(得分:3)
正如@JB Nizet注意到的,你的代码很好,只需在控制器中解决它 这是工作演示
angular.module('app', []);
angular.module('app').factory('objectArray', ['$http', function($http) {
// This is returning a $$state object
// instead of response.data...
////// changed request type and url for the sake of example
return $http.get('http://jsonplaceholder.typicode.com/posts/1')
.then(function(response) {
console.log(response.data);
return response.data;
});
}]);
angular.module('app').controller('applicationController', ['$scope', 'objectArray', function($scope, objectArray) {
//////resolve it here
objectArray.then(function(successResponse){
$scope.array = successResponse;
console.log($scope.array);
});
}]);
angular.bootstrap(document.body, ['app']);

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-controller="applicationController">
<h5>Hello {{array.title}}</h5>
</div>
&#13;
答案 2 :(得分:0)
错误
@ angular.js:14800 [AngularJS - Leaflet] The marker definition is not valid.
17:49:07.437 angular.js:14800 [AngularJS - Leaflet] Received invalid data on the marker $promise.
17:49:07.438 angular.js:14800 [AngularJS - Leaflet] The marker definition is not valid.
17:49:07.439 angular.js:14800 [AngularJS - Leaflet] Received invalid data on the marker $resolved.
$$ state是问题。
markersFactory.query().$promise.then(function(data) {
// open_street_maps to replace google maps
angular.extend($scope, {
center: {
lat: 40.7231572,
lng: -73.988501,
zoom: 13,
} ,
markers: data,
tiles: tilesDict.opencyclemap,
});
});
解决方案:angular.copy
markersFactory.query().$promise.then(function(data) {
$scope.markers = data;
// open_street_maps to replace google maps
angular.extend($scope, {
center: {
lat: 40.7231572,
lng: -73.988501,
zoom: 13,
} ,
markers: angular.copy($scope.markers),
tiles: tilesDict.opencyclemap,
});
});
竖起大拇指!.. =)