在键入

时间:2019-02-15 21:04:47

标签: knockout.js

我已经走了一个兔子洞,因为我认为那是微不足道的。目的是通过节流阀来验证用户输入的内容。

根据我所读的内容,我需要使用purecomputed可观察的对象,并使用rateLimit进行扩展。或类似的东西:

this.validateSmsValue = ko.pureComputed(function() {
        let hasPlaceholder = self.smsMsg().indexOf('[link_placeholder]');
        self.smsMsgIsValid(hasPlaceholder !== undefined);
    })
     .extend({
       rateLimit: { method: "notifyWhenChangesStop", timeout: 500 }
     });

在HTML中,我尝试与以下内容绑定:

<input id="smsMsgEdit"type="text" data-bind="textInput: smsMsg, event: {keypress: validateSmsValue}" maxlength="160" >

在当前形式下,我收到错误Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.

我将继续阅读文档并搜索示例,但我的Google-fu无法使我失望。

一旦用户停止输入1/2秒,验证用户在文本字段上输入的正确KnockoutJS方法是什么?

1 个答案:

答案 0 :(得分:2)

我认为您正在寻找的是对可观察对象的订阅,而不是使用计算函数。也不需要单独的按键事件绑定。

function viewModel(){
  var self = this;
  
  self.myValue = ko.observable().extend({ rateLimit: { timeout: 500, method: "notifyWhenChangesStop" } });
  
  //validate
  self.myValue.subscribe(function(newValue){
    console.log(!isNaN(newValue));
  });
  
}

ko.applyBindings(new viewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>

Value is a number?
<input type="text" data-bind="textInput: myValue" />