コンテンツにスキップ
メインメニュー
メインメニュー
サイドバーに移動
非表示
案内
メインページ
最近の更新
未作成ページ
おまかせ表示
ヘルプ
MonoBook
検索
検索
ログイン
個人用ツール
ログイン
ログアウトした編集者のページ
もっと詳しく
投稿記録
トーク
「
Knockout.js/clickバインディング
」を編集中 (節単位)
ページ
議論
日本語
閲覧
編集
ソースを編集
履歴表示
ツール
ツール
サイドバーに移動
非表示
操作
閲覧
編集
ソースを編集
履歴表示
全般
リンク元
関連ページの更新状況
特別ページ
ページ情報
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。
スパム攻撃防止用のチェックです。 けっして、ここには、値の入力は
しない
でください!
== 備考 == === clickで指定された関数には「現在のアイテム」を渡す === [[Knockout.js/withバインディング|withバインディング]]や[[Knockout.js/foreachバインディング|foreachバインディング]]のブロック内でclickバインディングを用いると、clickで呼ばれる関数の第一引数にwithやforeachで展開された各オブジェクトが自動的に渡される。 なお、ブロックの外側でclickバインディングを使うと第一引数にビューモデルが丸ごと渡される。 <source lang="html5"> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>knockout.js - clickバインディング 001</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() { var self = this; self.places = ko.observableArray([ { name: 'London', japanese: 'ロンドン' }, { name: 'Paris' , japanese: 'パリ' }, { name: 'Tokyo' , japanese: '東京' }, ]); self.removePlace = function(val) { // valはself.places内の各オブジェクト self.places.remove(val); }; self.clickButton = function(val) { // valはAppViewModelインスタンス(≒この例ではselfと同じモノ) alert(val); }; }; // バインディング適用 ko.applyBindings(new AppViewModel()); }); </script> </head> <body> <ul data-bind="foreach: places"> <li> <span data-bind="text: $data.name"></span> <button data-bind="click: $parent.removePlace">削除</button> </li> </ul> <button data-bind="click: clickButton">押すな!</button> </body> </html> </source> ==== みどころ1 ==== [[Knockout.js/withバインディング|withバインディング]]や[[Knockout.js/foreachバインディング|foreachバインディング]]のブロック内で入れ子になっている場合は、各種バインディングの際に「$parent」や「$root」などのプレフィックスを付ける必要がある。 詳細は[[Knockout.js/foreachバインディング|foreachバインディング]]の項目を参照。 ==== みどころ2 ==== AppViewModelオブジェクト内の[[コンストラクタ]]でthis変数をself変数に代入しているが、これは主に[[AJAX]]を使ったときの結果受信時に非同期で呼ばれるコールバック関数内でthis変数が再定義されてしまう問題を回避するためである。 この例ではthis変数もself変数も同じものだが、後々のことを考えてそういう風にしておきましょうという、一種の[[JavaScript]界でよく使われる[[デザインパターン]]だそうだ。 <source lang="html5"> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>knockout.js - clickバインディング 001</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() { var self = this; self.clickButton = function(val) { // これ true alert(this == self); jQuery.get("021_click.html", null, function(val) { // これ false alert(this == self); }); }; }; // バインディング適用 ko.applyBindings(new AppViewModel()); }); </script> </head> <body> <button data-bind="click: clickButton">押すな!</button> </body> </html> </source> === 既定のクリックアクションを有効化する === [[knockout.js]]でclickバインディングを設定すると、既定のクリックアクションが無効化される。たとえばHTMLのaタグにclickバインディングを適用してあると、hrefプロパティで指定されたリンク先へは飛ばなくなる。 これでは困るという場合には、clickバインディングで指定した関数が戻り値としてtrueを返すようにすると、既定のクリックアクションを有効化することができる。 <source lang="html5"> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>knockout.js - clickバインディング</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() { var self = this; // 飛ばない self.clickButton = function(val) { alert("click!"); }; // return trueで<a href="">のリンク先へ飛ぶ self.clickButtonWithJump = function(val) { alert("click!"); return true; }; }; // バインディング適用 ko.applyBindings(new AppViewModel()); }); </script> </head> <body> <a data-bind="click: clickButton" href="http://search.yahoo.co.jp/search?p=site%3Amonobook.org">Yahoo検索1</a><br/> <a data-bind="click: clickButtonWithJump" href="http://search.yahoo.co.jp/search?p=site%3Amonobook.org">Yahoo検索2</a><br/> </body> </html> </source>
編集内容の要約:
MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MonoBook:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の確認用の質問に回答してください (
詳細
):
1たす1は?(全角で入力してください)
キャンセル
編集の仕方
(新しいウィンドウで開きます)
このページは 1 個の隠しカテゴリに属しています:
カテゴリ:スタブ
本文の横幅制限を有効化/無効化