Dom Knockout.js文本绑定-多个空格折叠

Dom Knockout.js文本绑定-多个空格折叠,dom,knockout.js,textnode,Dom,Knockout.js,Textnode,似乎在使用Knockout的文本绑定时,多个空格会合并成一个空格。例如: <textarea data-bind="value: Notes"></textarea> <p data-bind="text: Notes"></p> 函数VM(){ this.Notes=ko.observable(); } var vm=新vm() ko.应用绑定(vm) 这里有一把小提琴来证明这一点: 我发现在JSFIDLE中,Firefox、Chrome

似乎在使用Knockout的文本绑定时,多个空格会合并成一个空格。例如:

<textarea data-bind="value: Notes"></textarea>
<p data-bind="text: Notes"></p>

函数VM(){ this.Notes=ko.observable(); }

var vm=新vm()

ko.应用绑定(vm)

这里有一把小提琴来证明这一点:

我发现在JSFIDLE中,Firefox、Chrome和IE9压缩了空间。奇怪的是,虽然在我的应用程序IE9中没有压缩它们,但其他的却压缩了

我的理解是,Knockout使用HTML文本节点来呈现值。我在创建文本节点时发现了有关保留空格的问题:

敲除应该适当地处理转换空间吗?我真的不想为此使用自定义绑定处理程序


实际上,我在select中的显示文本上下文中遇到了这个问题,并且在调试该问题时才发现它还与简单的文本绑定有关。我认为选择问题是相同的。

您观察到的是正常行为。在某些元素中渲染时,将修剪空白。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 });
    }
};

我同意敲除不应与可观察值混淆,但文本绑定本身不是只读的,所以我们只讨论确保值按预期呈现?但无论如何,感谢处理程序——因为只有少数情况下会应用这些多个空格,所以使用自定义处理程序并不太麻烦。干杯。好吧,可以这么说,“预期”的不是我预期的。不知何故,在这段时间里,我并没有注意到静态渲染的元素会产生这样的紧凑空间。啊!