【问题标题】:knockout issue with deleting from observable array从可观察数组中删除的淘汰赛问题
【发布时间】:2013-06-02 01:54:45
【问题描述】:

我正在将一个剔除函数数据绑定到我的 html。

下面是视图模型:

  var DonutViewModel = function () {
        this.donuts = ko.observableArray();
        //donutData = JSON.parse(donutData);
        var items = $.map(donutData, function (data) { return new Donut(data) });
        this.donuts(items);
        this.deletedonut = function (item) {
            this.donuts.remove(item);
        }
    }
   var viewModel;
   $(document).ready(function () {
      viewModel = new DonutViewModel();
      ko.applyBindings(viewModel);
   });

以下是html:

 <tr>
    <td><input id="txtdonutid" type="text" data-bind="value:id"/></td>
    <td><input id="txtdonuttype" type="text" data-bind="value:type"/></td>
    <td><input id="txtdonutname" type="text" data-bind="value:dname"/></td>
    <td><input id="txtppu" type="text" data-bind="value:ppu"/></td>
    <td><input type="button" value="Delete Donut" data-bind="click: function() {$parent.deletedonut($data)}"/></td>
</tr>

请注意我是如何对删除功能进行数据绑定的,并且这有效!。但如果我执行以下操作:

  <td><input type="button" value="Delete Donut" data-bind="click: {$parent.deletedonut($data)}"/></td>

好吧,这行不通。删除功能甚至没有被命中。

谁能告诉我我做错了什么?

【问题讨论】:

  • data-bind="click: function() {$parent.deletedonut($data)}" 是正确的语法。为什么要写data-bind="click: {$parent.deletedonut($data)}"
  • 好吧,如果您查看knockoutjs.com/documentation/click-binding.html,点击事件的绑定语法是 data-bind="click: myfunction"。这并不是说您必须在点击绑定中使用 function() 。那为什么不一样呢?
  • 但是如果你想添加额外的参数,你需要那个语法。请参阅 data-bind="click: {$parent.deletedonut($data)}" 语句。但是,在您的情况下,以下应该有效:data-bind="click: $parent.deletedonut"
  • data-bind="click: $parent.deletedonut" - 这行得通,谢谢!
  • 顺便说一句,你的意思是,如果我想要比默认数据更多的参数,我应该使用上面的语法是吗?

标签: function knockout.js ko.observablearray


【解决方案1】:

如果您想在$data. 旁边将其他参数传递给您的处理程序,您只需要在单击绑定中使用function() ... 语法(请参阅documentation:访问事件对象或传递更多参数部分)

但如果你唯一的参数是$data,那么 KO 会自动将它传入,所以你可以写:

<input type="button" value="Delete Donut" 
                     data-bind="click: $parent.deletedonut"/>

注意:不需要{},您也不需要参数($data),因为您将$parent.deletedonut 作为对该处理函数的引用传递。

但这本身在您的情况下不起作用,因为您在处理程序中使用this 来访问您的视图模型。

你有两个选择:

您可以使用bind: data-bind="click: $parent.deletedonut.bind($parent)" 在这种情况下您不需要更改您的处理程序。

演示JSFiddle

或者您可以将this 的引用存储在像self 这样的变量中,并在您的处理程序中使用它而不是this

因此将您的处理程序更改为:

var self = this; 
this.deletedonut = function (item) {
    self.donuts.remove(item);
} 

演示JSFiddle.

【讨论】:

  • 不幸的是, 这对我不起作用:(我尝试创建一个小提琴但它坏了jsfiddle.net/bxfXd/2269
  • 非常感谢!这说得通。在删除/添加函数中使用“this”设置对顶部对象的引用,而不是甜甜圈。感谢您解释这一点。
猜你喜欢
  • 2012-09-08
  • 2017-10-20
  • 2019-05-16
  • 2015-10-05
  • 2015-03-20
  • 2016-10-14
  • 2015-06-22
  • 1970-01-01
相关资源
最近更新 更多