2013-05-31 6 views
14

similar questions have been answered hereということを念頭に置いて、リストが空のときにノックアウトdata-bind='foreach: list'の中にデフォルトのテキストやHTMLを表示する方法を知りました。`foreach`が空のときノックアウトのデフォルトのテキスト

リンク先のページのソリューションは非常にこれをラインアップしていないようですし、どのような場合でも、私はこのようにカスタムバインディングでこれを実現しようとする別の方法を考えた:

text.default = { 
    update: function (element, valueAccessor) { 
     var $e = $(element), 
      obs = valueAccessor(); 

     function _check_blank() { 
     // the element has content - so we do nothing 
     if ($e.text().trim()) { 
      return; 
     } 
     // the element is empty; 
     $e.text("Default Text") 
     } 
     // we use setTimeout to ensure that any other bindings complete 
     // their update 
     setTimeout(_check_blank, 0); 
    } 
} 

この単純な観測では合理的にうまくいくようですが、foreachバインディングでは機能しませんが、いずれの場合でも上記のリンクのアドバイスがおそらくいくつかの理由で好ましいと思われます。上記のコードにはいくつかの注意点があります。それにもかかわらず、私はここにこの事例を投げかけました。なぜなら、それは思考のための選択肢と食料を幾分強調しているからです。

これまでのところ、foreachの代わりにデフォルトを提供するためのオプションについて知りたいと思います。

一つは、このように、簡単なifにラッパーを提供することです:

<!-- ko if: xyz().length --> 
    // foreach 
<!-- /ko --> 
<!-- ifnot: xyz().length --> 
    // default text 
<!-- /ko --> 

しかし、これは特にエレガントではありません - コードクラッタがたくさん。

+0

あなたがリスト空かない –

答えて

30

ノックアウトはififnotバインディングを提供します。あなたはちょうどforeachと要素から少し前に戻る必要があります。その内部は各要素のためのものなので、存在しないときは内部はありません。

<div data-bind="if: pets().length > 0">These are the pets:</div> 
<div data-bind="if: pets().length == 0">There aren't any pets. To add a pet...</div> 
<div data-bind="foreach: pets"> 

社説:空のリストではなくblank slateを示すの何かを言うための機会ですので、ご質問は重要です。

+1

おかげでトムかの場合に基づいて、いくつかの特定のdivを表示することができます)、そのループ内では、あなたはそれが0のだ場合、上のループにデータが存在しない、$データ長をチェックする必要があります。それは*空白のスレート*への素晴らしいリンクです。 'foreach'バインディングは単に' template'バインディングのラッパーです。コンテンツやタグそのものをテンプレートハンドラで任意に変更することができます。質問には、ifと 'ifnot'を使用する仮想要素に注意することもできます。質問の楽観的な願望は、表現される情報が意味論的および論理的に離散的であるタグの混乱を避ける解決策を得ることでした、不可分のユニット(それは起こっている - またはリストを持っている)。乾杯。 –

4

拡張Knockout Punchesはこのようなものを使用することができ、デフォルトのハンドラを提供3ノックアウト:

<span data-bind="text: name | default:'Nobody'"></span> 

もっと読み:私はあなたがずっと前にそれを求めている知っているKO Punches Documentation

1

、 多分、今日それを誰かを助けることができます。 観測可能な配列や依存性のある観測値(リストからのフィルタ結果など)で行うと、上記の解決策は機能しません。

この方法を使用して、KOにこの観測値を強制的に渡し、 "with"を使用して変更されているかどうかを確認できます。

<!--ko with: xyz --> 
    <div class="nodata" data-bind="visible:$data.length==0"> 
    Sorry, no data 
    </div> 
<!--/ko--> 
関連する問題