2013-09-26 43 views
0

我在knockoutJS中創建了一個計算的observable,它支持用戶輸入以及對輸入執行文本操作。.replace()表達式在計算的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

您是否需要將'.replace'鏈接到子字符串(0,255)'括號,而不是'report.Name()' – SmokeyPHP

+0

另外請注意,您的字符類中的空間就像任何其他字符,所以空格不會被模式刪除。 –

+0

@SmokeyPHP這是它的好眼睛!如果您將重新提交作爲答案與評論,我會將其標記爲答案。謝謝 – rlcrews

回答

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, '')); 

只要移動括號內的替換方法,它應該按預期工作。