"submit" バインディング
用途
submit バインディングは、関連付けられた DOM エレメントが submit されたときに
指定した JavaScript 関数を実行するイベントハンドラを追加します。
form で submit バインディングを使用した場合、
Knockout はその form の、ブラウザの通常の動作を妨げます (preventDefault)。
つまり、ブラウザは指定された関数を実行しますが、form の内容をサーバに送信することはありません。
この仕様の理由は、通常 submit バインディングを使う場合、form は ViewModel のインターフェイスとして使い、
標準の HTML form としては使わないからです。
もしも標準の HTML form としてフォームを送信させたいのであれば、submit にバインドした関数が
true を返却するようにして下さい。
例
<!-- View -->
<form data-bind="submit: doSomething">
...フォーム部品をここに配置...
<button type="submit">登録</button>
</form>
// ViewModel
var viewModel = {
doSomething : function(formElement) {
// ... なにかする
}
};
上記の例を見ていただければわかるように、submit にバインドした関数にはパラメタとして form エレメントが渡されます。
このパラメタは無視できますが、ko.utils.postJson のようなユーティリティで利用します。
訳者注 - ko.utils.postJson
ko.utils.postJsonは form エレメントから、そのフォームのデータを JSON にしてサーバに POST 送信するユーティリティ機能です。 現在、本家ドキュメントにおいてこの項目はリンク切れとなっており、 修正され次第翻訳する予定です。
Submit ボタンに cilck バインディングすればいいのでは?
確かに、form で submit を使う代わりに、Submit ボタンで click を使うことができます。
submit ならではの利点は、Submit をするのにボタンクリック以外の手段があるということです。
たとえばテキストボックスに入力中、Enter キーで Submit できます。
訳者注 - 検索ボックスでデモ
↓click バインディングだと、ボタンでしか反応しない。<!-- View -->
<h3>訳者注 - 検索ボックスでデモ</h3>
↓click バインディングだと、ボタンでしか反応しない。<br>
<div>
<input data-bind="value: Keyword" placeholder="キーワードを入力"/>
<button data-bind="click: Search">検索</button>
</div>
↓submit バインディングだと、テキストボックスで Enter キーをタイプしても実行される。<br>
<form data-bind="submit: Search">
<input data-bind="value: Keyword, valueUpdate: 'afterkeydown'" placeholder="キーワードを入力"/>
<button type="submit">検索</button>
</form>
<div data-bind="text: Result"> </div>
// ViewModel
function SearchBoxViewModel() {
var self = this;
self.Keyword = ko.observable("");
self.Result = ko.observable();
self.Search = function() {
if (self.Keyword() === "") {
alert("キーワードを入力して下さい");
return;
}
self.Result(self.Keyword() + " の検索結果...");
self.Keyword("");
};
}
ko.applyBindings(new SearchBoxViewModel());
パラメタ
主パラメタ
エレメントの
submitイベントにバインドしたい関数です。どんな JavaScript 関数も使用できます。ViewModel の関数である必要は、必ずしもありません。
submit: someObject.someFunctionのように書くことで、どんなオブジェクトの関数も参照できます。追加パラメタ
なし
備考
submit にバインドした関数に追加の引数を渡す方法や、ViewModel に属さない関数が呼び出された際の this を制御する方法については
click バインディング を参照してください。click バインディングの(注)はすべて submit バインディングにも適用できます。
依存
Knockout コアライブラリ以外、なし。