2012-01-10 80 views

回答

14

有几种方法可以做到这一点。我在这里展示的小提琴中展示了两种方法:http://jsfiddle.net/njj2P/2/

我展示的第一个选项是使用ko.computed来确定名称是否应以单数或复数形式根据评估返回。

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

第二个选项显示如何在没有计算属性的情况下执行此操作,而是使用条件绑定执行此操作。

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

我真的很想找一个干净的方法来做“y”到“ies”或“x”到“ces”等等。这个部分是很容易的部分。无论如何,我都赞成,但这不是我想要的。有任何想法吗?那里有什么? – vbullinger 2013-07-19 18:29:07

+0

我用upvoted这个答案,因为我使用了第二个选项,稍微改变了!=而不是>,以便零值显示s(即O子项,1子项,2子项) – MikeScott8 2014-04-30 21:07:49

+0

我同意并对我的代码进行了相同的观察和更改。 – GenuineRex 2018-01-24 15:26:08

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选项代表要显示,如果data计算结果为1
  • plural选项的文本表示将另行显示的文本。

看到它在这里行动。 http://fiddle.jshell.net/jessegavin/wamfw/

+1

我很喜欢这个解决方案。 – jaffa 2012-10-10 12:23:22

+2

很好的回答!我建议添加一个'none'选项和一个对'count'的反向引用,这样开发人员可以得到诸如“none”=>“No items”,“singular”=>“1 item”,“复数'=>“##项目”' – 2014-11-13 22:47:08

+0

好主意。这就是Angular所做的。 – jessegavin 2014-11-13 22:48:41

相关问题