将参数传递给在knockoutjs函数视图模型

问题描述:

我有这样将参数传递给在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()的?

个由于tierNameidentifier是可观察,你需要打电话给他们,获得他们的价值观:

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绑定其他信息。

+0

我想做'alert(tier); alert(标识符);'在我的viewmodel函数中,我并不真的想要上下文(this)。所以我的函数变成''setPath(tier,identifier)'感谢您的帮助 – nthapa13 2012-02-24 08:23:53

+0

如果KO不可用,KO会添加一个'bind'的实现,所以如果您引用KO,那么您可以安全地使用'bind'。 – 2012-02-24 13:56:47

+0

谢谢RP尼迈耶,很高兴知道。 – 2012-02-24 14:17:04

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

+0

谢谢@RPN的回应,它真的很有帮助。 – nthapa13 2012-02-24 08:22:34