【问题标题】:Avoiding double clicking event (button + row) with knockout避免带有敲除的双击事件(按钮+行)
【发布时间】:2013-02-19 17:14:59
【问题描述】:

我有以下敲除html代码:

<table class="vehicles" data-bind="with: chosenCategoryData">
    <tbody data-bind="foreach: Vehicles">
        <tr data-bind="click: $root.goToVehicle">
            <td data-bind="text: Brand"></td>
            <td data-bind="text: Model"></td>
            <td data-bind="text: Registration"></td>
            <td><button data-bind="click: $root.deleteVehicle">Delete</button></td>
        </tr>     
    </tbody>
</table>

单击任意行,将导航到详细信息页面。

单击删除按钮将删除该行上的元素。

此删除按钮位于最后一列。

问题是,当我点击删除按钮时,会触发名为 deleteVehicle 的淘汰赛事件(ok),但也会触发 goToVehicle 事件(nok)。

点击删除按钮时如何避免该行的点击事件?

谢谢。


更新

这是在 deleteVehicle 后面调用的事件:

self.deleteVehicle = function (vehicle)
{
    $.ajax({ url: "/api/vehicle?id=" + vehicle.VehicleId, type: "DELETE" });
    location.hash = vehicle.Category;
}

如您所见,首先我调用 ajax 来删除元素。接下来我强制重新加载我的网格。如果我使用 clickBubble 事件处理程序,它会在我的 deleteVehicle 函数中执行我的 ajax 调用,但不会执行 location.hash = vehicle.Category;。所以我的网格没有刷新???

【问题讨论】:

  • 文档在点击绑定下显示了这个确切的用例。

标签: knockout.js


【解决方案1】:

您可以在按钮上使用clickBubble 绑定。它将防止事件冒泡到 tr:

<table class="vehicles" data-bind="with: chosenCategoryData">
    <tbody data-bind="foreach: Vehicles">
        <tr data-bind="click: $root.goToVehicle">
            <td data-bind="text: Brand"></td>
            <td data-bind="text: Model"></td>
            <td data-bind="text: Registration"></td>
            <td><button data-bind="click: $root.deleteVehicle, clickBubble: false">Delete</button></td>
        </tr>     
    </tbody>
</table>

【讨论】:

  • 我尝试使用 clickBubble 的建议,但不是我真正需要的。在我的问题中查看我的更新。还是谢谢。
【解决方案2】:

你的代码应该可以工作。我不知道它为什么不工作。也许你可以摆弄一下,以便我们找出问题所在。

这也可以按您的预期工作:

为表格行和按钮添加 id

eg;)  <tr id ="tableRow" data-bind="click: $root.goToVehicle">
        <td data-bind="text: Brand"></td>
        <td data-bind="text: Model"></td>
        <td data-bind="text: Registration"></td>
        <td><button id="deleteBtn" data-bind="click: $root.deleteVehicle">Delete</button></td>
      </tr>      

如下更改您的 goToVehicle 方法:-

self.goToVehicle = function(data,event){
 if ( !$(event.target).is('deleteBtn') ) {  
    alert('clicked');  
    //some code here
 }  
});  

【讨论】:

  • 问题是我使用 sammy 框架进行客户端导航。在我的删除事件中,我执行“location.hash = vehicle.Category;”。当 clickBubble 为 false 时,则不执行此代码。所以我的解决方案是调整我的代码以另一种方式进行。还是谢谢。
猜你喜欢
  • 2015-11-29
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多