knockout.jsの表示の内外でクリックしたときHtmlに何かする
2012/05/29
やりたいこと
すべての「a.BehaviorClick」に対してイベントを追加したい。
- <script type="text/javascript">
- $(document).ready(function () {
- ko.applyBindings(new ViewModel());
- BindOfClickEvent();
- });
- function ViewModel() {
- var self = this;
- self.jsonData = ko.observableArray();
- $.getJSON("./testdata/testdataB.txt", {}, function(json){
- self.jsonData(json.item);
- }
- );
- }
- function BindOfClickEvent()
- {
- $('a.BehaviorClick').bind('click', EventWhenClick);
- }
- var EventWhenClick = function (e) {
- // htmlに何かしたい。
- ~色を変えたり文字サイズをいじったり画像を変更したり~
- return false;
- };
- </script>
- <table>
- <tbody>
- <tr>
- <td><a href="#" class="BehaviorClick">~~</a></td>
- </tr>
- </tbody>
- </table>
- <table>
- <tbody data-bind="foreach: jsonData">
- <tr>
- <td data-bind="text: name"></td>
- <td><a href="#" class="BehaviorClick">~~</a></td>
- </tr>
- </tbody>
- </table>
※これだと動作しないです。
上記の場合、2つめのtable内のリンクが動かない。
ko内でバインディング
koのclickバインディングとかやってみたり、アレコレしてたけど上記の「EventWhenClick」ってのに入ってくる「e」の値が異なる。
ということで、条件分岐をしてあげる必要あり。その際、引数の数を一つ増やす。
ということで、条件分岐をしてあげる必要あり。その際、引数の数を一つ増やす。
「EventWhenClick」で引数を二つにする必要あり。
一つ目の引数は
・koの内から呼び出された場合:ko.observableとかでの値
・koの外から呼び出された場合:htmlのDOMみたいなヤツ
二つ目の引数は
・koの内から呼び出された場合:色々な値を持ったヤツ(object)
・koの外から呼び出された場合:undefined
この二つ目の引数のなかに「target」ってのがいて、コイツがhtmlのDOMみたいなヤツ。