2012-02-23 80 views
7

我有這樣將參數傳遞給在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()的?

回答

6

個由於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

6

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