【问题标题】:knockoutjs - bindings with parameters triggered on loadknockoutjs - 加载时触发参数的绑定
【发布时间】:2012-04-11 02:05:46
【问题描述】:

最近做了很多knockoutjs,遇到了一个奇怪的现象。

正如您在这个小提琴http://jsfiddle.net/hqXjv/ 中看到的那样,当您设置与click: testMethod 的绑定时,单击按钮时会触发该操作。

正如您在这个小提琴http://jsfiddle.net/kxTzM/ 中看到的那样,当您将绑定设置为click: testMethod('hi') 时,该操作会在单击按钮和页面加载时触发(我猜是applyBindings)

重现问题不需要参数,如果您在第一个小提琴中将绑定更改为click: testMethod(),您会看到它在页面加载时触发。

虽然,是的,我可以向元素添加另一个属性并尝试将其用作参数,但我的问题是,有没有办法将参数传递给 knockoutjs 绑定而不触发它们加载。如果这是一个错误,那就这样吧,但是我只想知道一种避免它的方法。

【问题讨论】:

  • 这个错误今天把我逼疯了,我花了半天时间调试脚本却没有意识到这是一个错误。谢谢

标签: knockout.js


【解决方案1】:

我认为这个淘汰赛页面上的“注 2”说明了一切:

http://knockoutjs.com/documentation/click-binding.html

您可以通过以下方式避免该问题:

匿名函数:

<button data-bind="click: function(data, event) { myFunction(data, event, 'param1', 'param2') }">Click me</button>

...或...

绑定方法:

<button data-bind="click: myFunction.bind($data, 'param1', 'param2')">Click me</button>

【讨论】:

  • 感谢您的提示,但没有解释为什么在加载时触发点击事件..
  • 您的模板是直接调用该函数,而不是向其传递该函数的一个实例——通过将其包装在您提供的新函数中是一个调用您的函数的回调。这是将模板呈现为 JavaScript 的方式,并且在所有模板库中都很常见
  • 您可以通过从“注 2”中摘录相关信息和/或对其进行解释来改进此答案。我已经在您链接到的页面上阅读了“注 2”,但我仍然不清楚为什么会发生这种情况。我可以再花几分钟时间来理解它,但我希望你的回答能帮我做到这一点。
【解决方案2】:

以下在加载时执行了点击功能

click: clickSpan()

去掉括号如下,函数onload没有执行

click: clickSpan

(这在上面的注释 2 中进行了解释,但它是一种神秘的形式 :-)

【讨论】:

    【解决方案3】:

    我在以下情况下遇到了这种情况:

    • 我运行的是 Visual Studio 2013。
    • 我的淘汰项目使用的是 TypeScript 1.5。
    • 我使用 Visual Studio 调试器在 chrome 中运行我的项目。
    • 我对一些代码的重构很差,忽略了重新编译或重新运行调试器。

    因此,我相信发生的事情是我的 TypeScript 无法编译,只是我没有收到任何警告或错误,而且我对 TypeScript 所做的编辑没有正确反映在自动生成的 JavaScript 文件。

    其他人会看到这种情况可能并不常见,但是,我想有一个警告是,如果您在运行 VS 调试器时在适当的位置编辑 TypeScript,您可能会遇到这种情况或其他意外行为。我怀疑我在自动生成的 js 文件中创建了 Mark Robinson 描述的情况,但在我的 TypeScript 中没有看到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 2012-01-09
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多