2012-01-10 4 views

答えて

14

これを行うにはいくつかの方法があります。 http://jsfiddle.net/njj2P/2/ 私が示した最初のオプションは、ko.computedを使用して評価に基づいて名前を単数形または複数形に戻す必要があるかどうかを判断することです。

this.formattedName = ko.computed(function() { 
     return this.qty() > 1 ? this.name() + "s" : this.name(); 
    }, this); 

第2のオプションは、計算されたプロパティなしでこれを行う方法と、代わりに条件付きバインディングを使用する方法を示しています。

<span data-bind="if:qty()>1">s</span> 
+0

私は本当に "y"を "ies"や "x"を "ces"などにするクリーンな方法を探しています。この部分は簡単な部分です。私はとにかく反対票を出しましたが、それは私が欲しいものではありません。何か案は?そこに何か? – vbullinger

+0

私はそれに2番目のオプションを使用していたので、この答えをアップvしました!0の値が0を示すように!=の代わりに!=を少し変更しました(つまり、Oサブアイテム、1サブアイテム、2サブアイテム) – MikeScott8

+0

私は同意し、私のコードに同じ観察と変更を加えました。 – GenuineRex

12

次のような再利用可能なカスタムバインディングを作成できます。

ko.bindingHandlers.pluralize = { 
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
    function count(data) { 
     var value = ko.utils.unwrapObservable(data); 
     if (typeof value === "object" && value.length > 0) { 
      return value.length; 
     } else if (typeof value === "number") { 
      return value; 
     } 
    } 

    var settings = valueAccessor(); 
    var text = count(settings.data) === 1 ? settings.singular : settings.plural; 
    $(element).text(ko.utils.unwrapObservable(text)); 
    } 
}; 

このように使用します。

<span data-bind="pluralize: { data:items, singular:'entry', plural:'entries' }"></span> 
    data
  • オプションは、任意の配列または番号を指すことができます。
  • singularオプションは、datapluralオプションは、そうでない場合に表示されるテキストを表し1
  • と評価された場合に表示するテキストを表します。

ここでの動作を参照してください。 http://fiddle.jshell.net/jessegavin/wamfw/

+1

私はこの解決法を実際には本当に好きです。 – jaffa

+2

偉大な答え!開発者が '' none '=>' No items '、' singular '=>' 1 item '、' 'item' 'などのオプションを得ることができるように' none 'オプションとバックカウントを 'count'に追加することをお勧めします。複数== "## items" –

+0

良いアイデア。それがAngularと同じです。 – jessegavin

関連する問題