从子进程触发root方法时的上下文

时间:2012-05-24 12:27:53

标签: knockout.js

我有这个非常简单的测试视图

<button data-bind="click: add">Add</button>
<table data-bind="foreach: items">
    <tr>
        <td data-bind="text: name"></td>
        <td><button data-bind="click: $root.remove">Remove</button></td>
    <tr>
</table>

小提琴:http://jsfiddle.net/6PP5m/

问题是remove方法中的上下文是触发click事件的子视图模型

我没有找到我喜欢的解决方案,你可以在构造函数中添加一个自变量并使用它而不是“this”,但是它更干净的代码和OO使用“this”关键字

小提琴:http://jsfiddle.net/Qn2CM/

你也可以创建一个代理函数委托,但它仍然不是很干净的代码

小提琴:http://jsfiddle.net/gYhMr/

我想要告诉ko以某种方式将其上下文设置为正确的范围(在这种情况下为$ root)是否可能?

1 个答案:

答案 0 :(得分:6)

点击/事件绑定在您找到的当前数据的上下文中运行。

有几个选项可以确保您的函数以正确的上下文运行:

  • 将正确的this设置为self之类的变量,并在您的处理程序中使用它(如您所述)
  • 在视图模型中使用$.proxy.bind之类的内容,以确保this正确(如您所述)
  • 将函数绑定为data-bind="click: $root.remove.bind($root)"
  • 使用像({1}}
  • 这样的(丑陋的)匿名函数