Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从bind中删除2.0参数的顺序不正确?_Javascript_Knockout.js - Fatal编程技术网

Javascript 从bind中删除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的值。因此,在您的调用中

使用此数据绑定的敲除2.0:

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. 如果你有一个具体的例子,那么我也许可以帮你整理一下。通常应该有一种不使用匿名函数的方法使其工作。