【发布时间】:2012-02-06 17:33:55
【问题描述】:
文本数据绑定表达式只能有一个属性。我如何根据另一个属性的计数来复数一些文本?
【问题讨论】:
文本数据绑定表达式只能有一个属性。我如何根据另一个属性的计数来复数一些文本?
【问题讨论】:
有几种方法可以做到这一点。我在这里展示了两种方法: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>
【讨论】:
您可以创建一个可重复使用的自定义绑定,如下所示。
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/
【讨论】:
count 的反向引用,以便开发人员可以获得诸如'none' => "No items", 'singular' => "1 item", 'plural' => "## items" 之类的选项