knockout.jsでDOMから値を取得

  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>knockout.jsでDOMから値を取得</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. <style type="text/css">
  9. td, th{
  10.   border:1px solid #ccc;
  11. }
  12. </style>
  13. <script type="text/javascript">
  14.   $(document).ready(function () {
  15.     ko.applyBindings(new ViewModel());
  16.   });
  17.   function ViewModel() {
  18.     var self = this;
  19.     self.jsonTemporary = {};
  20.     self.jsonData = ko.observable();
  21.     self.tempTaste = ko.observable();
  22.     this.viewTaste = ko.computed( function()
  23.     {
  24.       return self.tempTaste();
  25.     }, this);
  26.     // 表示
  27.     self.GotoView = function(json) {
  28.       this.jsonData(json);
  29.     };
  30.     // 登録
  31.     self.entryTaste = function(data, event) {
  32.       htmlDom = event.target;
  33.       this.taste = $(htmlDom).parents("tr").find(".span")[0].innerText;
  34.       self.tempTaste(this.taste);
  35.     };
  36.     // 削除
  37.     self.deleteTaste = function(data, event) {
  38.       htmlDom = event.target;
  39.       this.taste = "";
  40.       self.tempTaste(this.taste);
  41.     };
  42.     // デフォルトでの表示:元データを読込んでおく
  43.     $.getJSON("./testdata/testdataA.txt", {}, function(json){
  44.       json["taste"] = "";
  45.       
  46.       self.jsonTemporary = json; // 何回も読込みされるのがイヤなので保管しておく
  47.       self.GotoView(self.jsonTemporary);
  48.     });
  49.   }
  50. </script>
  51. </head>
  52. <body>
  53. <h1>knockout.jsでDOMから値を取得</h1>
  54. <div>
  55.   <table data-bind="visible: jsonData()">
  56.     <thead><tr><th>品名</th><th>金額</th><th>味</th><th>ボタン</th></thead>
  57.     <tbody data-bind="with: jsonData">
  58.       <tr>
  59.         <td data-bind="text: name"></td>
  60.         <td data-bind="text: price"></td>
  61.         <td data-bind="text: $root.viewTaste"></td>
  62.         <td>
  63.           <span class="span">味噌</span>
  64.           <button data-bind="click: $root.entryTaste">確定</button>
  65.           <button data-bind="click: $root.deleteTaste">削除</button>
  66.         </td>
  67.       </tr>
  68.     </tbody>
  69.   </table>
  70. </div>
  71. <div style="font-size:10pt;text-align:right;margin-top:0.5em;">
  72. <a href="//tips.recatnap.info/" target="_top">PCスキルの小技・忘却防止メモ</a> -
  73. <a href="//tips.recatnap.info/wiki/" target="_top">PCスキルの小技・忘却防止メモのまとめ(wiki)</a>
  74. </div>
  75. <div style="font-size:10pt;text-align:center;margin-top:0.5em;padding:0.5em;border-top:1px solid #ccc;">
  76. Copyright &copy; 2009 by PCスキルの小技・忘却防止メモ. All rights reserved.
  77. </div>
  78. </body>
  79. </html>