そのため、以前にajaxリクエストを正常に処理することができましたが、常にフォームを使用する必要があり、送信の最後にfalseを返してページを更新しないようにしました。
また、最近javascriptを別のファイルに移動したため、@コマンドが失敗しました。このため、URLをルートに設定する方法はありませんか?
HTML:
<button id="saveAsDefaultButton">Save as default</button>
Playframework Javaコード:
public static Result saveDefaultPhoneForUser(String handset) {
User currentUser = User.findByName(session("name"));
currentUser.lastControlledHandset = theHandset;
currentUser.save();
return ok();
}
ルート:
POST / controllers.Application.saveDefaultPhoneForUser(handset : String)
javascript:
$('#saveAsDefaultButton').click(function(evt) {
$('#errors').hide();
$.ajax({
type : 'POST',
url : "controllers.Application.saveDefaultPhoneForUser",
data : $('#controlledPhone option:selected').text(),
dataType : "text",
success : function(data) {
//setError('Call succedded');
//$('#test1').attr("src", data)
},
error : function(data) {
setError('Make call failed');
}
});
return false;
});
これを行う方法は確かにありますが、私は何も見つけることができません。どんな助けも大いに評価しました。
このジョブでは、routes.confに基づいて正しいJSパスを生成するため、javascriptRoutes
を使用する必要があります。 Zentaskに使用サンプルがあります sample
とにかく、今のところurl
を変更することでAJAX呼び出しを修正できます
_url : '@routes.Application.saveDefaultPhoneForUser()',
_
この方法では、JS全体をテンプレートに配置する必要がありますが、これは間違っています。別のJSファイルに移動することもできますし、javascriptRoutesを使用する必要があるようにすることもできます。
その他...
javascriptRoutesは記述されていませんyet公式ドキュメントにありますが、ここにステップバイステップの紹介があります。説明は洗練されているように見えますが、事実上この方法を使用すると多くの利点があります。
最初に、_conf/routes
_ファイルに共通のルートを作成する必要があります。
_GET /item/:id controllers.Application.getItem(id: Long)
POST /item/new controllers.Application.newItem
PUT /item/:id controllers.Application.updateItem(id: Long)
_
もちろん、少なくとも次の3つのアクションをApplication
コントローラーで作成する必要があります。
getItem(Long id){ ... }
newItem() { ... }
updateItem(Long id) { ... }
Application
コントローラー内javascriptRoutes()
と呼ぼうそのアクションでは、conf/routes
_ファイルからexistingルートをポイントします
_public static Result javascriptRoutes() {
response().setContentType("text/javascript");
return ok(
Routes.javascriptRouter("myJsRoutes",
routes.javascript.Application.getItem(),
routes.javascript.Application.newItem(),
routes.javascript.Application.updateItem(),
//inside somepackage
controllers.somepackage.routes.javascript.Application.updateItem()
)
);
}
_
注:括弧内にパラメータを設定しないでください。
javascriptRoutes
アクションのルートを作成し、テンプレートに含めますルート_conf/routes
_
_GET /javascriptRoutes controllers.Application.javascriptRoutes
_
_<head>
_の一部を_/views/main.scala.html
_の一部で表示
_<script type="text/javascript" src='@routes.Application.javascriptRoutes()'></script>
_
これまでは、JSでルートを使用して、url
およびtype
を指定することなく正しいパスを取得できます。代わりの例:
_ $('.getAjaxForThisContainer').click(function(e) {
var idToGet = $("#someField").val();
$.ajax({
type : 'GET',
url : '@routes.Application.getItem()',
data : {
id: idToGet
},
success : function(data) {
// ... some code on success
}
});
return false;
});
_
簡易バージョンを使用できます(ポイント2からのmyJsRoutes
):
_myJsRoutes.controllers.Application.getItem(idToGet).ajax({
success : function(data) { ... some code ... }
});
_
または
_myJsRoutes.controllers.Application.newItem().ajax({
success : function(data) { ... some code ... }
});
_
等...
type: "POST"
_を指定する必要はありません-JSルーターは_conf/routes
_ルールに従って正しいメソッドを使用しますroutes-like
_構文を使用して、レコード(または他のパラメーター)のid
をGET
またはPUT
(または他のメソッド)に設定できます。ルートの場合:
_GET /some/:a/:b/:c controllers.Application.getABC(a: String, b: Integer, c: String)
_
JS:
_myJsRoutes.controllers.Application.getABC("a", 1, "b" ).ajax({});
_
私は「古き良き」シンプルな方法が好きです:
1ページで、JQueryを使用して、
偶数ハンドラーの中
_ $.get('/giveme', {'arg': value}, function(data) {
window.alert(data);
}
);
_
2サーバー/プレイ側
2.1ルート:GET /giveme controllers.Application.giveme(arg)
2.2 scalaアクション:
_object Application extends Controller {
def giveme(arg:String) = Action {
Ok(Json.toJson("hello," + arg ))
}
}
_
気をつけるべきこと...呼び出すとき
Routes.javascriptRouter("myJsRoutes",
ルートは、play.api.Routesではなく、play.Routesからインポートされます
このコードを実装したときにエラーが発生したのは、それがapiから来ていると想定していたためです(明らかに間違いでした)。それ以外は、すべてがうまくいきます〜!!
より簡単なソリューションがあり、組み込みルーターを使用してJavascriptルーターを生成します。 _@javascriptRouter
_ヘルパーディレクティブを使用してJavascriptルーターを生成し、htmlページヘッドタグ内に次のコードを配置できます(メインの装飾テンプレート内にある場合があります)
_<head>
<title>Saeed Title</title>
<link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
<script src="@routes.Assets.at("javascripts/jquery/v1.12.4/jquery.min.js")" type="text/javascript"></script>
@helper.javascriptRouter("jsRoutes")(
routes.javascript.MyController.getById,
routes.javascript.MyController.getByName
)
</head>
_
構文エラー(Intellijで)を気にせず、アクション名の後に括弧を使用しないでください。これで、ajax呼び出しコードでjsRoutes.controllers.MyController.getById(id)
を使用できます。
_$.ajax(jsRoutes.controllers.MyController.getById(id))
.done( /*...*/ )
.fail( /*...*/ );
_
または、jsRoutes.controllers.MyController.getById(id).url
を使用してURLを取得します。 詳細 。
マーカスの答えは非常に良いので、この問題を抱えている人なら誰でもこれを使用できるはずです。
しかし、これを機能させようとすると、作業に少し時間がかかりました。私がajaxリクエストを行っていたとき、間違ったメソッドにルーティングしていました。
これは、routesファイルに次のものがあったためです。
POST / controllers.Application.makeCall()
POST / controllers.Application.saveDefaultPhoneForUser(handset : String)
同じ場所/を持つ2つのpostメソッドを使用します。いつも電話をかけるように見えた。だから、だれかのための単なるヒントは、そうしないとうまくいかない。
次のように変更する必要がありました。
POST / controllers.Application.makeCall()
POST /saveDefaultPhoneForUser controllers.Application.saveDefaultPhoneForUser(handset : String)
これが誰かを助けることを願っています。