2

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

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

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

var vm = 新的 VM();

ko.applyBindings(vm);

这是一个证明这一点的小提琴:http: //jsfiddle.net/9rtL5/

我发现在 jsfiddle 中,空间在 Firefox、Chrome 和 IE9 中被压缩。奇怪的是,虽然在我的应用程序中 IE9 不会压缩它们,但其他的却可以。

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

http://www.webdeveloper.com/forum/showthread.php?193107-RESOLVED-Insert-amp-nbsp-when-using-createTextNode%28%29

Knockout 是否应该适当地处理转换空间?我真的不想为此使用自定义绑定处理程序。

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

4

1 回答 1

1

您所观察的是正常行为。在某些元素中渲染时,空白被修剪。淘汰赛不应该进行任何自动替换,如果我想使用淘汰赛将字符串发送到具有前导/尾随空格的服务器,最好使用这些空格将其发送到那里。

您应该创建一个绑定处理程序以用不间断空格替换空格,以便可以以这种方式呈现。

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 });
    }
};

演示

于 2012-11-16T04:10:31.747 回答