将参数传递给knockoutjs viewmodel中的函数

时间:2012-02-23 17:40:37

标签: knockout.js

我有像这样的锚标签

<a href="#" class="btn btn-success order-btn" data-bind="attr:{'data-tiername':$data.tierName, 'data-identifier' : $parent.identifier}, click: $root.setPath.bind($data,$data.tierName, $parent.identifier)">Send values</a>

在viewmodel中

var appViewModel = {
    setPath: function (data, tier, identifier) {
        alert(data);
        alert(tier);
        alert(identifier);
    },
...........
...........
}

结果是一些knockoutjs核心代码显示在警告消息中(可能是observable(),dependentObservable()函数和[Object object]的定义,当使用JSON.stringify提醒时它是空的)

为什么这样做?

data-bind="attr:{'data-tiername':$data.tierName, 'data-identifier' : $parent.identifier}

但不是这样:

click: $root.setPath.bind($data,$data.tierName, $parent.identifier)

请注意,tierName是一个observable(),标识符是compute()

我在哪里可以找到更多关于bind()??

的信息

2 个答案:

答案 0 :(得分:6)

bind的第一个参数是执行函数时的目标(您希望this成为什么)。所以,如果你想让data成为第一个参数,那么它需要是第二个参数。

在你的函数中,如果你正在处理observables或计算的observables,那么你需要打开它们以查看它们的值。您可以通过将其作为函数alert(data());调用或通过调用alert(ko.utils.unwrapObservable(data));(通常在您不知道设计类型时使用,如果您将要处理的是可观察的)来执行此操作或者是不可观察的。

传递可观察/计算的observable时attr和其他绑定工作的原因是,为方便起见,它们都为您调用ko.utils.unwrapObservable(因此您不必添加()传递observable时,除非你正在编写表达式!$data()

以下是关于bind的一些参考:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

答案 1 :(得分:6)

由于tierNameidentifier是可观察的,因此您需要调用它们来访问其值:

click: $root.setPath.bind($data, $data.tierName(), $parent.identifier())

此外,bind()中的第一个参数将绑定到this中的setPath,因此我猜您需要这样的内容:

click: $root.setPath.bind(/*will be bound to this*/ $root, $data, 
                      $data.tierName(), $parent.identifier())

最后,如果$data本身是一个可观察的(不清楚它是否来自你的代码),那么你也需要调用它:

click: $root.setPath.bind($root, $data(), $data().tierName(), $parent.identifier())

还记得在ECMAScript 5中引入了 bind ,因此它可能不会出现在所有浏览器中。所以我可能会做这样的事情:

click: function(){$root.setPath($data, $data.tierName(), $parent.identifier());}

Here bind 的其他信息。