knockout.js 单击事件绑定的敲除传递$parent

ehxuflar  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(208)

我有这样的代码:

<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吗?

r7xajy2e

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()预定义的参数向右移动的
第一个
希望这个答案能帮助一些人。=)

k5hmc34c

k5hmc34c2#

classClick函数中的“this”变量是$parent。传递给classClick的第一个参数是$data. This fiddle demonstrates

ko.applyBindings({
elements: [
    {
        classFixes : ["ab","cd"]
    },
    {
        classFixes : ["ef","gh"]
    }
 ],
 classClick : function(first)
 {
    alert(JSON.stringify(this));
    alert(JSON.stringify(first));
 }
});

相关问题