我有这样的代码:
<div id="menu">
<ul data-bind="foreach: elements">
<li>
<span data-bind="text:domObj().tagName +' [' + classOriginal() + ']', click: $root.elementClick"></span>
<ul class="menuclassitem" style="display:none" data-bind="foreach: classFixes">
<li data-bind="text:$data, click:$root.classClick.bind($parent)"></li>
</ul>
</li>
</ul>
</div>
正如您所看到的,我试图将$parent对象(“elements”数组中的当前项)传递给$root.classClick函数,但实际传递的值是当前内部循环的$data(当前“classFixes”数组的$data)
有人知道如何在classClick函数中使用$parent吗?
2条答案
按热度按时间r7xajy2e1#
这是一个很化石的问题,但它仍然可能帮助一些人。
这个问题更多的是关于
.bind()
的方式,而不是KnockoutJS。所以首先我们需要了解bind()是如何工作的:bind()方法创建一个新函数,在调用该函数时,将其this关键字设置为提供的值,并在调用新函数时提供的任何参数之前设置一个给定的参数序列。more...
现在让我们回到问题上。默认情况下,KnockoutJS将当前的
$data
作为click
-binding接收到的函数的第一个参数传递。同样的$data
被用作默认上下文。在@DorR写入click:$root.classClick.bind($parent)
后,单击binding接收到一个具有重定义上下文的函数(到$parent)和预定义的参数,这允许KO将$data作为第一个参数传递。$parent现在可以在classClick
中作为this
访问。为了说明它是如何工作的,我在下面做了一个小片段。试着点击不同列的按钮,检查下面的调试日志,看看KO传递的参数是如何被
.bind()
预定义的参数向右移动的第一个
希望这个答案能帮助一些人。=)
k5hmc34c2#
classClick函数中的“this”变量是$parent。传递给classClick的第一个参数是$data. This fiddle demonstrates