单击一行时,KnockoutJS返回一个空的JSON对象

时间:2014-07-07 21:04:43

标签: javascript json knockout.js

我的问题是当我点击KnockoutJS中数据绑定的行时,发送到我的selectItem函数的数据为空,只在Firefox Web Console中显示{"data":{}}

我不明白的是如何获取表格单元格的值以便我可以引用我的JSON对象的sender部分?目前,它是空的。

KnockoutJS:

function ServiceViewModel() {
   var self = this;
   self.rows = ko.observableArray();

   $.ajax({
          method: "GET",
          url: "URL",
          success: function(data) {
             var observableData = ko.mapping.fromJSON(data);
             var array = observableData();
             self.rows(array);
          }
   });

   self.computedRows = ko.computed(function() {
       if(!self.query()) {
          return self.rows();
       } else {
          return ko.utils.arrayFilter(self.rows(), function(row) {
             return row.sender() == self.query();
          });
       }
   });

   self.selectedItem = ko.observable();
   self.selectItem = function(data) {
       self.selectedItem(data);
       console.log(JSON.stringify(self.selectedItem()));
   };

};

$(document).ready(function() {
   var svc = new ServiceViewModel();
   ko.applyBindings(svc);
});

JSON:

[{"statusmsg":"OK","data":{"status":"running"},"sender":"hostname","statuscode":0}]

HTML:

<div class="table-responsive">
   <table class="table table-condensed table-striped table-bordered table-hover">
      <thead>
         <tr>
            <th>Host</th>
            <th>Status</th>
            <th>Actions</th>
         </tr>
      </thead>
      <tbody data-bind="foreach: computedRows().sort(function(l, r) { return l.sender() > r.sender() ? 1 : -1})">
         <tr data-bind="click: $root.selectItem">
            <td data-bind="text: sender"></td>
            <td><span data-bind="text: data.status"></span></td>
            <td>
               <div class="btn-group">
                  <button data-bind="click: $root.selectItem">Start</button>
                  <button>Stop</button>
               </div>
            </td>
         </tr>
      </tbody>
   </table>
</div>

1 个答案:

答案 0 :(得分:2)

你需要使用ko.toJSON将你的淘汰模型转换为json而不是JSON.stringify,因为knockout使用了observables的函数。

console.log(ko.toJSON(self.selectedItem()));