Angularグリッドを使用して、ajaxのデータをconsole.logに取得しますが、空のグリッドです。
コンソールログには次のように表示されます。
[13:56:11.411] now!!
[13:56:11.412] []
[13:56:11.412] now!!
[13:56:11.556] <there is data returned from console.log(getData); >
これはjsファイルです。
// main.js
var app = angular.module('myApp', ['ngGrid']);
var getData = [];
function fetchData() {
var mydata = [];
$.ajax({
url:'/url/to/hell',
type:'GET',
success: function(data) {
for(i = 0, j = data.length; i < j; i++) {
mydata[i] = data[i];
}
getData = mydata;
console.log(getData);
}
});
}
fetchData();
app.controller('MyCtrl', function($scope) {
console.log('now!!')
console.log(getData)
console.log('now!!')
$scope.myData = getData
$scope.gridOptions = {
data: 'myData',
showGroupPanel: true
};
});
新しいJsファイル:
// main.js
var app = angular.module('myApp', ['ngGrid']);
app.controller('MyCtrl', function($scope, $http) {
function fetchData() {
$http({
url:'/url/to/hell',
type:'GET'})
.success(function(data) {
$scope.myData = data;
$scope.gridOptions = {
data: 'myData',
showGroupPanel: true
};
});
}
fetchData();
});
HTMLファイル。
<html ng-app="myApp">
<head lang="en">
<meta charset="utf-8">
<title>Blank Title 3</title>
<link rel="stylesheet" type="text/css" href="http://angular-ui.github.com/ng-grid/css/ng-grid.css" />
<link rel="stylesheet" type="text/css" href="../static/css/style.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js"></script>
<script type="text/javascript" src="http://angular-ui.github.com/ng-grid/lib/ng-grid.debug.js"></script>
<script type="text/javascript" src="../static/js/main.js"></script>
</head>
<body ng-controller="MyCtrl">
<div class="gridStyle" ng-grid="gridOptions"></div>
</body>
</html>
.successが完了する前に、コントローラーがgetData配列にアクセスしている可能性があります。空の配列に初期化されているpromise関数の外で、すぐに変数にアクセスしています。
(今のところ)fetchData関数をコントローラーに入れて、.successの$ scope.myDataにgetDataを直接格納してみませんか?たぶん、グリッドも初期化しますか?それができるかどうかはわかりませんが、できれば次のようになります。
app.controller('MyCtrl', function($scope, $http) {
$scope.myData = '';
$scope.gridOptions = { showGroupPanel: true, data: 'myData' };
function fetchData() {
setTimeout(function(){
$http({
url:'/url/to/hell',
type:'GET'})
.success(function(data) {
$scope.myData = data;
if (!$scope.$$phase) {
$scope.$apply();
}
});
}, 3000);
}
fetchData();
});
($ scope適用対象のソース: https://github.com/angular-ui/ng-grid/issues/39 )
また、jQuery .ajaxでangularコード($ httpがそれを実行します)と混在している理由と、JavaScriptにセミコロンがない理由もわかりません。
リクエストに対してサービスを定義した場合、これははるかに簡単になります(そしてより多くのAngular)。これらの線に沿った何か:
_angular.module('hellServices', ['ngResource'])
.factory('Hell', function ($resource) {
return $resource('URL/TO/HELL', {}, {
query: { method: 'GET' }
});
});
_
アプリに必ず含めてください:
_var app = angular.module('myApp', ['ngGrid', 'hellServices']);
_
それからあなたはあなたのコントローラーでそれの約束を得ることができます:
_app.controller('MyCtrl', function($scope, $http, Hell) {
$scope.myData = Hell.query();
_
次に、グリッドオプションを設定して、データの約束を確認します(既に行ったように)。
_$scope.gridOptions = {
data: 'myData',
showGroupPanel: true
};
_
これを行う場合は、$ scope。$ applyが処理されるため、心配する必要はありません。これははるかにすっきりとしていて簡単に追跡できます。サーバーから返された後もデータを変更するためのコールバックが必要な場合は、サービスのquery()
関数に関数を渡します。
_...
$scope.myData = Hell.query(function(hell) {
// code that modifies 'hell'
});
_
Angularサービスの 公式ドキュメント を確認してください。基本は 公式#Angular JSチュートリアルのステップ#11 。