Javascript 从bind中删除2.0参数的顺序不正确?
使用此数据绑定的敲除2.0:Javascript 从bind中删除2.0参数的顺序不正确?,javascript,knockout.js,Javascript,Knockout.js,使用此数据绑定的敲除2.0: data-bind="click: $root.deleteSomeEntity.bind($data, $parent)" 在Knockout viewmodel JavaScript中 self.deleteSomeEntity = function (data, parent) { // perform deletion } 似乎是父项而不是数据 这种行为是有原因的还是我遗漏了什么?当您调用bind时,第一个参数将是this的值。因此,在您的调用中
data-bind="click: $root.deleteSomeEntity.bind($data, $parent)"
在Knockout viewmodel JavaScript中
self.deleteSomeEntity = function (data, parent) {
// perform deletion
}
似乎是父项而不是数据
这种行为是有原因的还是我遗漏了什么?当您调用
bind
时,第一个参数将是this
的值。因此,在您的调用中,这个
将是$data
,第一个参数将是$parent
在本例中,如果$root
是$parent
,则您可以执行以下操作:
$root.deleteSomeEntity.bind($root)
KO将数据作为第一个参数传递,并且此
将设置为$root
如果$parent
不是$root
(并且您可能不想依赖这个是另一个对象,而$root
是您在root上的方法中的对象),那么您可以执行以下操作:
$root.deleteSomeEntity.bind($root、$data、$parent)
否则,肯定有办法确保您的视图模型中有适当的this
。但这取决于您的结构。为什么要使用bind()
?默认情况下,如果您只是将javascript函数的名称写为click事件,那么Knockout将传递$data
作为第一个参数,事件作为第二个参数
(注1和2)
既然您可以简单地执行以下操作,为什么还要麻烦使用bind()
:
data-bind="click: function() {$root.deleteSomeEntity($data, $parent)}"
遵循您的建议:但是,当单击“删除”和self.deleteContactPhone=功能(viewModel,phone,contact)
时,viewModel是电话,phone是联系人,contact也是电话<代码>此
当前是viewmodel。您可能希望它更像:。有几件事要提remove
是一个在observableArray上可用的功能。我将你的手机
阵列切换为可观察的,这样你就可以删除
,当其中一个被删除时,你的UI就会更新。另一件事是,你希望你的函数签名只是函数(电话,联系人)
。bind
的第一个参数是target,用于在函数运行时控制this
的值。因此,它实际上不是函数的参数。感谢ryan提供的信息,我不确定我是否真的同意KO使用第一个参数神奇地变成这个
,但这是你们的决定。然而,这方面的文件完全不清楚。我强烈建议更新关于的文档,以包括我们在这里讨论的主题。我回头看了看,我发现关于这一点的唯一参考是“在事件处理程序中,这被重新定义为意味着其他东西”,我甚至不确定这是否与我们的主题直接匹配,或者这是否是一般的Javascript只是一个注记:使用bind
的第一个参数作为this
不是KO的决定<代码>绑定
在大多数较新的浏览器中都是本机支持的,KO为没有绑定的浏览器添加了这种支持。关于bind的一些信息:该代码似乎是在没有为我点击的情况下执行的。它在一个数据绑定中=“foreach:…”如果这改变了什么的话。哦,当然了!很抱歉,我已经编辑了代码,因此在单击绑定周围包装了一个function()
。这应该会像预期的那样起作用。这只是一种风格。许多人不喜欢在标记中放置匿名函数。这是人们开始使用KO时会感到厌烦的事情之一,尤其是当他们习惯于更不引人注目的方式时。无论哪种方式,它都可以正常工作,尽管我更喜欢确保在视图模型本身中适当地设置this
。@RPNiemeyer:我也不喜欢在标记中放置匿名函数,但是使用bind()
语法正确地设置this
使我感到困惑,所以索尼奇的方式最终是唯一对我有效的方式。YMMV@JimG. 如果你有一个具体的例子,那么我也许可以帮你整理一下。通常应该有一种不使用匿名函数的方法使其工作。