.replace()表达式未在计算的observable中更新

时间:2013-09-26 14:08:20

标签: javascript regex knockout.js

我在knockoutJS中创建了一个计算的observable,它支持用户输入并对输入执行文本操作。

这个observable绑定到输入字段和标签。目的是允许用户输入新名称,但我想阻止用户使用非字母数字字符。该函数适用于字符串的绑定和求值,但替换函数似乎没有更新。子字符串函数有效(将文本限制为255个字符),但我认为我在替换中没有完全正确设置。在当前功能中,如果输入了非法字符,则用户会收到toastr警报,但替换功能不会用空格替换该字符。我很感激任何建议。

HTML

<label class="reportNameTextBox" title="Click to edit report name"  data-bind="text: NameFormatted() == null || NameFormatted().trim().length == 0 ? '[ Click To Enter Name ]' : NameFormatted(), css: { 'noData': NameFormatted() == null || NameFormatted().trim().length == 0 }"></label>
            <input class="editInput" type="text" data-bind="value: NameFormatted" />

敲除

report.NameFormatted = ko.computed({
     read: function () {
           return report.Name().substring(0, 255);
           },
     write: function (value) {
           var insertedText = value;
           var Exp = /^[a-zA-Z0-9]*$/i;
           if (!insertedText.match(Exp)) {
           DisplayWarning('Attention', 'Non-alphanumeric may not be used.');
                            return report.Name(insertedText.substring(0, 255)).replace(/[^a-zA-Z 0-9]+/g, ''); ;
           }
           else {
           DisplayWarning('Success', 'yeah');
           return report.Name(insertedText.substring(0, 255));
           }
          },
    owner: this
});

1 个答案:

答案 0 :(得分:0)

我相信你的问题就在于这条线:

return report.Name(insertedText.substring(0, 255)).replace(/[^a-zA-Z 0-9]+/g, '');

您将replace方法链接到错误的对象(report.Name而不是substring

return report.Name(insertedText.substring(0, 255).replace(/[^a-zA-Z 0-9]+/g, ''));

只需在支架内移动替换方法,它就可以按预期工作。