次のような簡単なアプリを作成しようとしています。1。ユーザーが2つのパラメーターを入力し、ボタンをクリックします。2.AngularがJSONを返す外部JAVAサーブレットを呼び出します。3。アプリがjson文字列を画面に出力します。
しかし、ボタンをクリックしても何も起こらないので、問題があります。(テストのために)これが発生する理由は、呼び出しが非同期であるため、返される変数がnullであるためだと思います。
関連コード:
controllers.js
function myAppController($scope,kdbService) {
$scope.buttonClick = function(){
var dat = kdbService.get($scope.tName,$scope.nRows);
$scope.data = dat;
}
}
services.js
angular.module('myApp.services', []).factory('kdbService',function ($rootScope,$http){
var server="http://localhost:8080/KdbRouterServlet";
return {
get: function(tname,n){
var dat;
$http.jsonp(server+"?query=krisFunc[`"+tname+";"+n+"]&callback=JSON_CALLBACK").
success(function(data, status, headers, config) {
console.log("1");
console.log(data);
dat=data;
}).
error(function(data, status, headers, config) {
alert("ERROR: Could not get data.");
});
console.log("2");
console.log(dat);
return dat;
}
}
});
index.html
<!-- Boilerplate-->
<h1>Table Viewer</h1>
<div class="menu" >
<form>
<label for="tName">Table Name</label>
<input id="tName" ng-model="tName"><br>
<label for="nRows">Row Limit</label>
<input id="nRows" ng-model="nRows"><br>
<input type="submit" value="Submit" ng-click="buttonClick()">
</form>
</div>
{{data}}
<!-- Boilerplate-->
コードを実行してボタンを押しても、何も起こりません。ただし、ログを見ると、次のように表示されます。
2
undefined
1
Object {x: Array[2], x1: Array[2]}
明らかに、何が起こっているのかというと、get関数が戻った後にsuccess関数が戻ってくるということです。したがって、$ scope.dataに入れられたオブジェクトは未定義ですが、jsonp呼び出しから返されたオブジェクトは残されます。
これを行う正しい方法はありますか?私が見るチュートリアルのほとんどは、success関数内の$ scope変数にデータを割り当て、それによってこの問題をスキップします。可能であれば、サービスを切り離してほしい。
どんな助けでもいただければ幸いです。