将参数传递给在knockoutjs函数视图模型
<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>
在视图模型
var appViewModel = {
setPath: function (data, tier, identifier) {
alert(data);
alert(tier);
alert(identifier);
},
...........
...........
}
结果锚定标记是一些knockoutjs被显示在警报消息的核心代码(可能的定义observable(),dependentObservable()函数和[对象对象]在用JSON.stringify提醒时为空)
为什么这样可行?
data-bind="attr:{'data-tiername':$data.tierName, 'data-identifier' : $parent.identifier}
但不是这样的:
click: $root.setPath.bind($data,$data.tierName, $parent.identifier)
注意tierName是可观察到的(),标识()计算
我在哪里可以找到更多关于bind()的?
个由于tierName
和identifier
是可观察,你需要打电话给他们,获得他们的价值观:
click: $root.setPath.bind($data, $data.tierName(), $parent.identifier())
此外,在bind()
第一个参数将在setPath
被绑定到this
,所以我想你需要的东西是这样的:
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中引入,所以它可能不会出现在所有浏览器中。所以,我可能会做这样的事情,而不是:
click: function(){$root.setPath($data, $data.tierName(), $parent.identifier());}
Here是绑定其他信息。
bind
的第一个参数是当你的函数执行时的目标(你想要this
)。所以,如果你想data
成为第一个参数,那么它需要是第二个参数。
在你的函数内部,如果你正在处理observables或计算observables,那么你需要解开它们才能看到它们的值。你可以通过调用它作为函数alert(data());
或通过调用alert(ko.utils.unwrapObservable(data));
(当你不知道设计类型时通常使用这个函数,如果你要处理的是可观察或不可观察的函数)
之所以attr
和其他绑定当你通过一个可观察/计算机可观察到的是,他们对你的所有呼叫ko.utils.unwrapObservable
为了方便(这样你就不必通过观测,除非你正在写一个表达式!$data()
时添加()
。
以下是关于绑定的一些参考:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind
谢谢@RPN的回应,它真的很有帮助。 – nthapa13 2012-02-24 08:22:34
我想做'alert(tier); alert(标识符);'在我的viewmodel函数中,我并不真的想要上下文(this)。所以我的函数变成''setPath(tier,identifier)'感谢您的帮助 – nthapa13 2012-02-24 08:23:53
如果KO不可用,KO会添加一个'bind'的实现,所以如果您引用KO,那么您可以安全地使用'bind'。 – 2012-02-24 13:56:47
谢谢RP尼迈耶,很高兴知道。 – 2012-02-24 14:17:04