そのため、サーバーにオブジェクトのコレクションがあり、ページの読み込み時に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を取得する代わりに、$$ stateオブジェクトを取得します。
私のコントローラーは次のようになります。
app.controller('applicationController', ['$scope', 'objectArray', function($scope, objectArray) {
$scope.array = objectArray;
console.log($scope.array);
}]);
$ httpサービスが返すもの(したがって、objectArray
サービスは)はpromiseと呼ばれます。実際のデータにアクセスするには、呼び出されるコールバック関数を登録しますデータが利用可能な場合、つまりhttpリクエストへの応答がサーバーから返される場合:
objectArray.then(function(data) {
$scope.array = data;
});
Resolveを使用するときにデータに直接アクセスできる理由は、resolve関数がpromiseを返すと、ルーターがpromiseが解決されるのを待つためです。そしてその時だけ、promiseからデータを抽出し、そのデータをコントローラーに注入します。
@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>
エラー
@ 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,
});
});
親指を立てる!.. =)