似乎在使用Knockout的文本绑定时,多个空格会折叠成一个。例如:
<textarea data-bind="value: Notes"></textarea>
<p data-bind="text: Notes"></p>
function VM(){ this.Notes = ko.observable(); }
var vm = new VM();
ko.applyBindings(VM);
这是一个演示这个的小提琴:http://jsfiddle.net/9rtL5/
我发现在jsfiddle中,这些空间在Firefox,Chrome和IE9中被压缩了。奇怪的是,尽管在我的应用程序中,IE9并没有压缩它们,但其他人都这样做。
我的理解是Knockout使用HTML文本节点来呈现值。我在创建文本节点时发现了与保留空间相关的问题:
Knockout应该适当地处理转换空间吗?我真的不想为此使用自定义绑定处理程序。
我实际上在select中的显示文本的上下文中遇到了这个,并且发现它在调试该问题时也与简单的文本绑定有关。我认为选择问题是一样的。
答案 0 :(得分:1)
您所观察到的是正常行为。在某些元素中渲染时,会修剪空白。 Knockout不应该执行任何自动替换,如果我想使用knockout将字符串发送到具有前导/尾随空格的服务器,那么最好使用这些空格。
你应该创建一个绑定处理程序来用不间断的空格替换空格,这样它就可以这样呈现。
ko.bindingHandlers.spacedtext = {
replaceSpace: function (str) {
return new Array(str.length + 1).join('\xA0');
},
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var spacedValue = ko.computed(function () {
var value = ko.utils.unwrapObservable(valueAccessor()),
text = value && value.toString();
return text && text.replace(/^\s+|\s+$/gm, ko.bindingHandlers.spacedtext.replaceSpace);
});
ko.applyBindingsToNode(element, { text: spacedValue });
}
};