Javascript 击倒剑道网格数据绑定事件

Javascript 击倒剑道网格数据绑定事件,javascript,knockout.js,kendo-ui,knockout-kendo,Javascript,Knockout.js,Kendo Ui,Knockout Kendo,我有一个剑道用户界面网格使用设置 我在网格的一列中有几个自定义按钮,即调用ajax来编辑另一个div中的条目、删除一个或检查editId来调用函数。我的问题是,这两个事件都触发了两次!此外,对我来说,它看起来像是数据绑定事件,而数据绑定事件是相同的 这里有一个 我尝试了一些不同的方法 还有一个 在绑定网格和数据时触发事件。 但是,当所有数据都存在时,我如何确定只获取一个事件 有人知道那里发生了什么吗?顺便说一句,我正在使用映射插件。由于不同的原因触发了dataBound事件。第一次触发时,如果您

我有一个剑道用户界面网格使用设置

我在网格的一列中有几个自定义按钮,即调用ajax来编辑另一个div中的条目、删除一个或检查editId来调用函数。我的问题是,这两个事件都触发了两次!此外,对我来说,它看起来像是
数据绑定
事件,而
数据绑定
事件是相同的

这里有一个

我尝试了一些不同的方法

还有一个

在绑定网格和数据时触发事件。 但是,当所有数据都存在时,我如何确定只获取一个事件


有人知道那里发生了什么吗?顺便说一句,我正在使用映射插件。

由于不同的原因触发了
dataBound
事件。第一次触发时,如果您
console.log()
该事件,您将看到:

  • e.sender.\u data
    是一个空数组
    []
  • e.element[0]
    is
    div.k-grid.k-widget
当事件再次激发时,相同的属性显示为:

  • e.sender.\u data
    是一个长度为3的数组,包含如下项:
    {color:“green”,name:“apple”,uid:“…”}
  • e.element[0]
    div.k-grid.k-widget
    (相同的元素)
这似乎意味着您的网格实际上将数据绑定到自身两次

如果让我猜的话,KO的
KO.applyBindings(newviewmodel())初始化对象并触发事件。之后,当剑道试图在内部绑定元素数据时,再次触发事件

要避免这种情况,请参阅:

在这里,您可以使用类似于:

var grid = $("#grid").data("kendoGrid");
grid.bind("dataBinding", grid_dataBinding);
grid.dataSource.fetch();
当初始配置绑定设置为
autoBind:false

这样您就不会意外地捕捉到第一个错误的数据绑定事件

如果我有时间,我将用一个JSFIDLE来演示这一点

解决方案1:这应该会有所帮助

解决方案2:


设置
autoBind:false
,使网格不会自动绑定。(@jason9187)

正如另一位用户所提到的,您可以通过更改上述telerik文档中提到的设置来关闭初始自动绑定:

基本上,在您的第一种方法中,此修复:

变成:

或者在第二种方法中添加相同的属性


Fiddle:

设置
autoBind:false
,以便网格不会自动绑定

this.gridConfig = {
    data: self.myData,
    autoBind : false,
    datasource: {
        data: 'data'
    },
    dataBound: function(){
        alert('dataBound');
    },
    dataBinding: function(){
        alert('dataBinding');
    },
};

我在下面贴了一个回复。它确实会稍微改变代码的格式,以实现您想要的。如果您有任何关于如何使其在当前设置中工作的具体问题,请让我知道。很简单,但它似乎可以解决此问题!抱歉:-/这都是关于分享信息和互相帮助的:)好的,非常感谢!我的设置非常复杂,文件大约有1600行。。。但事实上,似乎简单的一行*autoBind:false*解决了我的问题。。。
var grid = $("#grid").data("kendoGrid");
grid.bind("dataBinding", grid_dataBinding);
grid.dataSource.fetch();
this.gridConfig = {
    data: self.myData,
    autoBind : false,
    datasource: {
        data: 'data'
    },
    dataBound: function(){
        alert('dataBound');
    },
    dataBinding: function(){
        alert('dataBinding');
    },
};