2013-08-20 6 views
13

ノックアウトを使用して、表示テンプレートにリンクとmailtoを含むテーブルを表示しようとしています。私はまだノックアウトするのは本当に新しいです、私は事前に謝罪します!KnockoutJSのHrefとmailtoリンク

これは私の表示テンプレートは、もともとあったものです。

<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> 

、これは私がこれまで持っているもので、マイナスのmailtoおよびリンク:attrtextプロパティを使用して

<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

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をバインドするときに関数構文で電子メールにアクセスしてください。そうでない場合は、値ではなく関数定義が返されます。

<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> 

例:

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

は、その後、あなたのビューに基づいて計算に観察を行います。http://jsfiddle.net/lifetimelearner/yr7SP/2/

3

あなたはMVVMにすべての道を行きたい場合、それは可能な限りダムあなたのビューを維持するのが最善ですモデル:

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 *にロジックがある場合は、* one * place:計算されたobservableでのみ変更するのが簡単です。ビューで文字列の連結を行った場合、mailtoリンクを使用したすべての場所を更新する必要があります。 – Jeroen

+0

味に関係なく、コードはOPの問題を解決する有効な方法です;-) – Jeroen

関連する問題