Knockout VIewModel在foreach中触发函数

时间:2014-09-26 21:44:55

标签: javascript knockout.js

我正在与奇怪的问题作斗争,我的想法已经不多了。

问题是我的视图模型在点击时触发foreach内部的功能。所以在这种情况下,如果我点击div menuConnections测试调用功能正在被触发。即使我向testcall发送其他值(例如div id),当我点击menuConnections时也会发送相同的值。

如何停止此操作并仅在我点击TheDivWhoCalls时强制执行testcall?

function ProfileViewModel(userId) {
    var self = this;
  
    self.connectionRequests = ko.observableArray();

  self.getConnections = function () {
        $("#menuConnections").css({ "display": "block" });
    
    //other code which returns data
    };
  
  self.testcall = function(data) {
        alert(target);
    };;
    
  }
<div id="menuConnections" data-bind='click: getConnections'>Connections</div>

<div id="connections" style="display: none">
  
  <div data-bind="foreach: connectionRequests">
    
    <div id="TheDivWhoCalls" data-bind='click: $root.testcall("asd")'><img src="~/Resources/Images/yesIcon.png" /></div>
    
  </div>
  
</div>

2 个答案:

答案 0 :(得分:2)

我无法通过ko.applyBindings看到实际运行的示例,但尝试更改

data-bind='click: $root.testcall("asd")

 data-bind='click: $parent.testcall.bind($parent, "asd")

说明:

首先我将$root更改为$parent。我不知道您的$root是什么,但可以安全地假设您的$parent是使用testcall方法的虚拟机。

更重要的是,click:期望一个函数,但$root.testcall("asd")调用返回undefined的函数。相反,我们使用Function.prototype.bindtestcall创建一个新功能,参数设置为"asd"this设置为$parent

答案 1 :(得分:0)

您可能需要使用绑定语法。试试data-bind="$root.testcall.bind($data, 'asd')"