我有像这样的锚标签
<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()??
的信息答案 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)
由于tierName
和identifier
是可观察的,因此您需要调用它们来访问其值:
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 的其他信息。