【问题标题】:Knockout Click is not working when we are using Jquerybootgrid当我们使用 Jquery Bootgrid 时,Knockout Click 不起作用
【发布时间】:2018-03-15 12:26:45
【问题描述】:

我是 KnockoutJS 的新手。我想在单击按钮(或锚点)时触发事件。我已使用 Jquery Bootgrid 将数据附加到表中,但无法收到警报。

var vm;

function VM() {
  var self = this;
  self.ShowMessage = function() {
    alert("Hi");

  }
}
$(document).ready(function() {
  var data = [];
  data.push({
    Name: "Sample"
  })
  data.push({
    Name: "Sample2"
  })
  data.push({
    Name: "Sample3"
  })



  $("#UserList").bootgrid({
    caseSensitive: false,

    formatters: {
      "Actions": function(column, curr) {
        return "<a href='#'  data-bind='click:VM.ShowMessage' class='on-default edit-row'>Hello</a>";
      }

    }
  }).bootgrid("append", data);



  vm = new VM();
  ko.applyBindings(vm, document.getElementById("MyDiv")[0]);
})
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-bootgrid/1.3.1/jquery.bootgrid.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>


<div class="container">
  <div class="row" id="MyDiv">

    <table style="overflow-y:hidden; max-height: 460px;" id="UserList" class="table table-condensed" cellspacing="0">
      <thead>
        <tr>

          <th data-column-id="Name">Name</th>
          <th data-formatter="Actions" data-visible-in-selection="false">Actions</th>

        </tr>
      </thead>
      <tbody></tbody>
    </table>
  </div>
</div>

请帮帮我。

关联jsFiddle here

【问题讨论】:

  • 发布有问题的请求代码,而不是保留所有内容
  • 2 种方式 - 当动态 html 添加到 Dom 时,您必须再次重新绑定它们(cleanNode/applybindings)或 setTimeout 以便您的网格 html 准备就绪。 jsfiddle.net/f43scuqe/29 。我更喜欢 applyBindings 只有在数据准备好时才可能在 ajax 成功。
  • 当使用带有Knockout的jQuery时,你通常应该考虑custom binding handler
  • @supercool 谢谢。但我不应该使用设置超时功能。我试过在ajax成功后应用绑定,它根本不起作用。

标签: jquery knockout.js jquery-bootgrid


【解决方案1】:

您可以使用 bootgrid 事件,然后在数据准备好时使用 applyBindings。

loaded 事件在按照doc 加载数据后触发。

代码:

$("#UserList").bootgrid({ /*your settings*/ }).bootgrid("append", data)
  .on("loaded.rs.jquery.bootgrid", function(e) {
      if ($(this).bootgrid("getTotalRowCount")) // >0 auto evaluates to true
        ko.applyBindings(new VM(), document.getElementById("MyDiv")[0]);
    }
 });

始终将插件命名空间 .rs.jquery.bootgrid 附加到事件中 名称以便订阅事件。

grabs

的工作示例

【讨论】:

  • 如果Bootgrid的记录多于1条,我需要每次都申请绑定,也会报错(不能多次申请绑定)。
  • 每次?仅加载一次竞争数据时触发加载事件。
  • 请查看此链接。如何为单独的引导网格单独归档 Click 事件。 jsfiddle.net/f43scuqe/62
  • 检查此链接,@superCool。如果我使用多个引导网格,我将面临问题。 jsfiddle.net/f43scuqe/62
  • @Avi 那么你需要使用 applyBinding 的第二个参数,它采用元素 id 。工作样本jsfiddle.net/supercool/f43scuqe/79 .
猜你喜欢
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多