2013-08-20 32 views
13

我想要顯示一個鏈接和使用Knockout在顯示模板中的mailto的表。我還是真的很新,想提前道歉!Hock和mailto鏈接在KnockoutJS

這是我的顯示模板原是:

<script type="text/template" id="customerSearchDisplayTemplate"> 
    <td class="hiddenId">{0}</td> 
    <td><a href="/wrenchsciencewebadmin2/UserManager/Customer/CustomerEditor.aspx?CustomerID={1}">{1}</a></td> 
    <td><a href="mailto:{2}">{2}</a></td> 
    <td>{3}</td> 
    <td>{4}</td> 
    <td>{5}</td> 
    <td>{6}</td>  
    <td>{7}</td> 
    <td><a href="/wrenchsciencewebadmin2/Common/PopupWindows/CustomerNotes.aspx?customerid={8}">{8}</a></td>      
</script> 

,這是我到目前爲止,減去郵寄地址和鏈接:

<script type="text/template" id="customerSearchDisplayTemplate"> 
    <tr> 
     <td class = "hiddenId"><span data-bind="text: customerSearchID"/></td> 
     <td><span data-bind="text: fullName" /></td> 
     <td><span data-bind="text: primaryEmail" /></td> 
     <td><span data-bind="text: secondaryEmail" /></td> 
     <td><span data-bind="text: homePhone" /></td> 
     <td><span data-bind="text: workPhone" /></td> 
     <td><span data-bind="text: mobilePhone" /></td> 
     <td><span data-bind="text: lastLogonDate" /></td> 
     <td><span data-bind="text: wsNotes" /></td>    
    </tr> 
</script> 

回答

20

使用attrtext性質在data-bind屬性中是這樣的:

<script type="text/template" id="customerSearchDisplayTemplate"> 
    <tr> 
     <td class = "hiddenId"><span data-bind="text: customerSearchID"/></td> 
     <td><span data-bind="text: fullName" /></td> 
     <td> 
      <span> 
       <a data-bind="text: primaryEmail, 
           attr: {href: 'mailto:'+primaryEmail()}" /> 
      <span/> 
     </td> 
     <td> 
      <span> 
       <a data-bind="text: secondaryEmail, 
           attr: {href: 'mailto:'+secondaryEmail()}" /> 
      <span/> 
     </td> 
     <td><span data-bind="text: homePhone" /></td> 
     <td><span data-bind="text: workPhone" /></td> 
     <td><span data-bind="text: mobilePhone" /></td> 
     <td><span data-bind="text: lastLogonDate" /></td> 
     <td><span data-bind="text: wsNotes" /></td>    
    </tr> 
</script> 
+0

用戶2048714是正確的,您需要確保您使用該函數訪問該值。 –

4

確保在綁定attr即primaryEmail()時通過函數語法訪問電子郵件,否則它將返回函數定義而不是值。

<div data-bind="template: { name : 'customerSearchDisplayTemplate'}"></div> 

<script type="text/template" id="customerSearchDisplayTemplate"> 
    <tr> 
     <td class="hiddenId"> 
      <span data-bind="text: customerSearchID"/> 
     </td> 
     <td><span data-bind="text: fullName" /></td> 
     <td> 
      <a data-bind="text: primaryEmail, 
          attr: { href : 'mailto:'+primaryEmail() }" /> 
     </td> 
     <td> 
      <a data-bind="text: secondaryEmail, 
          attr: { href : 'mailto:'+secondaryEmail() }"/> 
     </td> 
     <td><span data-bind="text: homePhone" /></td> 
     <td><span data-bind="text: workPhone" /></td> 
     <td><span data-bind="text: mobilePhone" /></td> 
     <td><span data-bind="text: lastLogonDate" /></td> 
     <td><span data-bind="text: wsNotes" /></td>    
    </tr> 
</script> 

例子:http://jsfiddle.net/lifetimelearner/yr7SP/2/

3

如果你想要去MVVM所有的方式,它是最好的,讓您查看啞地:

<a data-bind="text: primaryEmail, attr: {href: primaryEmailMailtoLink}"></a> 

然後進行計算觀察到你的觀點型號:

var ViewModel = function() { 
    var self = this; 

    // Observable property: 
    self.primaryEmail = ko.observable('[email protected]'); 

    // Dependent observable: 
    self.primaryEmailMailtoLink = ko.computed(function() { 
      return 'mailto: ' + self.primaryEmail(); 
    }; 

    // Etc. (rest of your view model) 
} 
+2

我不同意這是「MVVM一路」。 MVVM並不意味着愚蠢的意見,它意味着*分離*視圖和視圖模型。這實際上是通過使用HTML鏈接知識來將視圖模型綁定到視圖。電子郵件地址將被鏈接使用的事實是視圖模型不應具有的知識,但是視圖*應具有的知識。您可以爲'mailto'鏈接創建一個'綁定處理程序',但我認爲這很難實現。在'mailto'鏈接中顯示電子郵件的視圖是查看行爲,應該留在那裏。 – Tyrsius

+0

@Tyrsius你提出了一個有效的觀點。但是,我仍然認爲「mailto」不是* View *的一個方面,而是* Model *的一個方面,因爲它封裝了業務邏輯。考慮您想要添加CC或使用其他高級[mailto功能](http://en.wikipedia.org/wiki/Mailto)的情況。如果你在* Model *中有邏輯,那麼很容易改變,只能在*一個地方:計算出來的觀察值。如果您在視圖中完成了字符串連接,則必須更新每個使用mailto鏈接的地方。 – Jeroen

+0

無論口味如何,代碼是解決OP問題的有效方法;-) – Jeroen