Knockout.js/textバインディング
Knockout.jsのtextバインディングとは、パラメーターの値に応じ、関連付けられたDOM要素内のテキストを書き換える可視バインディングのひとつである。
textバインディングは、通常spanタグやemタグといった要素の内容を書き換えるのに使うものだが、技術的には任意のあらゆる要素で使用できる。
textバインディングで書き換えられた文字列はすべては強制的にプレーンテキストとなる。 プレーンテキストではなくHTMLで書き換えたい場合にはhtmlバインディングを使用する。 ただしhtmlバインディングは使い方を一歩間違うとスクリプトインジェクション攻撃を受ける危険性が高いので素人にはおすすめできない。
パラメーター
Knockout.jsは、関連付られたDOM要素内のテキスト(IEであればinnerTextプロパティ、FirefoxであればtextCotnentプロパティの値)を、パラメーターの値で上書きする。
このパラメーターがobservableオブジェクトの場合は、値を更新するたびにテキストも更新する。パラメーターがobservableオブジェクトでない場合はバインディング適用時(applyBindings関数実行時)に1回だけ更新されて以降は更新されない。
パラメーターの値の型が数値(number型)または文字列(string型)の場合はそのものを、それ以外の場合はtoString()メソッドを実行した結果でテキストを上書きする。
使用例
hello world
textバインディングを使用した「hello, world」はこんな感じ。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>knockout.js - text bindding sample 1</title>
<script type="text/javascript" src="jquery-1.5.1.min.js"></script>
<script type="text/javascript" src="knockout-2.0.0.js"></script>
<script type="text/javascript">
jQuery(function() {
// モデル
var AppViewModel = function() {
this.message = ko.observable("hello, world");
}
// バインディング適用
ko.applyBindings(new AppViewModel());
});
</script>
</head>
<body>
<div data-bind="text: message"></div>
</body>
</html>
HTMLの使用
textバインディングのパラメーターにHTMLを書いてもそのままの文字列として表示される(HTMLエスケープされた文字列が表示される)。HTMLで上書きしたい場合はhtmlバインディングを使用する。
式の使用
textバインディングには簡単な式が使える。 式に関する詳細はKnockout.jsの項目を参照。
3項演算子の使用例。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>knockout.js - text bindding sample 1</title>
<script type="text/javascript" src="jquery-1.5.1.min.js"></script>
<script type="text/javascript" src="knockout-2.0.0.js"></script>
<script type="text/javascript">
jQuery(function() {
// モデル
var AppViewModel = function() {
this.price = ko.observable("19800");
}
// バインディング適用
ko.applyBindings(new AppViewModel());
});
</script>
</head>
<body>
<p><span data-bind="text: price"></span>円の商品について</p>
<p>Aさんは <span data-bind="text: price() > 20000 ? '高い' : '安い'"></span> と言いました。</p>
<p>Bさんは <span data-bind="text: price() > 10000 ? '高い' : '安い'"></span> と言いました。</p>
</body>
</html>