1

我正在使用这个插件http://www.joshbuckley.co.uk/2011/07/knockout-js-datatable-bindings/ 来处理数据表/ko 绑定。这是JS代码:

function ProductViewModel() {
  // Init.
  var self = this;
  self.products = ko.observableArray();
  self.singleProduct = ko.observable();
  var mappedProducts;

  // At first load i'm loading data.
  $.getJSON("/admin/test", function(allData) {
    mappedProducts = $.map(allData, function(item) { 
      var p = new Product(item);
      // I'm adding a new property to my model, to handle row level actions.
      // I'm not sure this is a good practice.
      p.edit = "<button data-bind='click: $root.edit'><i class='icon-pencil'></i></button>";
      return p;
    });
    self.products(mappedProducts);
  });

  // Here i'm using the basic switch pattern, as from KO tutorials.
  self.edit = function(product) {
    console.log(product); // <--- Prints the whole self.products() array
    self.singleProduct(product);
    self.products(null);
  }

  self.list = function() {
    self.products(mappedProducts);
    self.singleProduct(null);
  }
}

// My model.
function Product(item) {
  this.name = ko.observable(item.name);
  this.dealer = ko.observable(item.dealer);
  this.cost = ko.observable(item.cost);
  this.price = ko.observable(item.price);
  this.picture = ko.observable();
}

这是我的标记:

<table id="products-table" class="table table-striped table-bordered table-hover"
             data-bind="dataTable: {data: $parent.products, options: {aoColumns: [
        { bSortable: false, mDataProp: null, sDefaultContent: '' },
        {mData: 'name'}, 
        {mData: 'dealer'},
        {mData: 'cost'},
        {mData: 'price'}, 
        { bSortable: false, mData: 'edit' }
      ]}}">
        <thead>
          <tr>
            <th>Pic</th>
            <th>Name</th>
            <th>Dealer</th>
            <th>Cost</th>
            <th>Price</th>
            <th>Actions</th>
          </tr>
        </thead>

        <tbody></tbody>
      </table>

我能够虚拟地在列表和编辑视图之间切换,绑定似乎得到了正确处理。

问题:在编辑处理程序中,我希望接收单个模型作为参数;我收到了整个系列,所以我无法识别要编辑的模型。

还有一件事:我完全不确定这是在行上绑定事件的好习惯,所以任何建议都将不胜感激!

4

1 回答 1

1

好吧,我想我自己明白了,在查看插件源代码后,原因很清楚。

从插件源:

(function($){
    ko.bindingHandlers.dataTable = {
        init: function(element, valueAccessor){
            var binding = ko.utils.unwrapObservable(valueAccessor());

            // If the binding is an object with an options field,
            // initialise the dataTable with those options. 
            if(binding.options){
                $(element).dataTable(binding.options);
            }
        },
        update: function(element, valueAccessor){
            var binding = ko.utils.unwrapObservable(valueAccessor());

            // If the binding isn't an object, turn it into one. 
            if(!binding.data){
                binding = { data: valueAccessor() }
            }

            // Clear table
            $(element).dataTable().fnClearTable();

            // Rebuild table from data source specified in binding
            $(element).dataTable().fnAddData(binding.data());
        }
    };
})(jQuery);

基本上,对于每个更新操作,表都会被清理并使用可观察数组再次构建,该数组应该提供绑定功能。

KO 在每次原生 click: 绑定中试图做的是将上下文数据(即整个数组)传递给适当的处理程序。

于 2013-10-19T16:13:35.600 回答