「クリックしたらアラート表示」というカスタムバインディング:ko

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>「クリックしたらアラート表示」というカスタムバインディング:ko</title>
  6. <script type="text/javascript" src="jquery-1.5.1.min.js"></script>
  7. <script type="text/javascript" src="knockout-2.1.0beta.js"></script>
  8. <script type="text/javascript">
  9.   ko.bindingHandlers.koClickAlert = {
  10.     init: function(element, valueAccessor)
  11.     {
  12.       // clickイベントを監視する
  13.       $(element).click(function()
  14.       {
  15.         var value = valueAccessor();
  16.         value(true);
  17.       });
  18.     },
  19.     update: function(element, valueAccessor, allBindingsAccessor)
  20.     {
  21.       // 現状の値と、サブプロパティ一覧の取得
  22.       var value = valueAccessor(), allBindings = allBindingsAccessor();
  23.       var valueUnwrapped = ko.utils.unwrapObservable(value);
  24.       
  25.       // 処理
  26.       if (valueUnwrapped == true)
  27.       {
  28.         alert("クリックされたのでアラートを表示する");
  29.       }
  30.     }
  31.   };
  32.   $(document).ready(function () {
  33.     ko.applyBindings(new ViewModel());
  34.   });
  35.   function ViewModel() {
  36.     var self = this;
  37.     self.testCustom = ko.observable();
  38.   }
  39. </script>
  40. <style type="text/css">
  41. .windowModal
  42. {
  43.   position:absolute;
  44.   left:0; top:0;
  45.   z-index:9999;
  46.   background:#fff;
  47. }
  48. </style>
  49. </head>
  50. <body>
  51. <h1>「クリックしたらアラート表示」というカスタムバインディング:ko</h1>
  52. <button data-bind="koClickAlert: testCustom">クリック</button>
  53. <div style="font-size:10pt;text-align:right;margin-top:0.5em;">
  54. <a href="//tips.recatnap.info/" target="_top">PCスキルの小技・忘却防止メモ</a> -
  55. <a href="//tips.recatnap.info/wiki/" target="_top">PCスキルの小技・忘却防止メモのまとめ(wiki)</a>
  56. </div>
  57. <div style="font-size:10pt;text-align:center;margin-top:0.5em;padding:0.5em;border-top:1px solid #ccc;">
  58. Copyright &copy; 2009 by PCスキルの小技・忘却防止メモ. All rights reserved.
  59. </div>
  60. </body>
  61. </html>