可观察订阅(循环)-防止用户输入错误的输入
Knockoutjs Observable Subscription (loop) - Prevent user from entering wrong input
如果用户输入不是预期的值,是否可能"不更改"值?例如,下面的代码可以工作:
function data(sno, exp) {
var self = this;
self.sno = ko.observable(sno);
self.exp = ko.observable(exp);
self.previousValue = 0;
self.exp.subscribe(function(param1){
this.previousValue = param1;
}, self, "beforeChange");
self.exp.subscribe(function(param1){
try {
this.exp(eval(param1));
}
catch(err) {
this.exp(this.previousValue);
}
}, self);
}
但是,调试时我意识到,当我改变可观察变量exp
的值时,使用this.exp(this.previousValue);
再次触发订阅,这重复了几次,直到值与beforeChange
和change
事件没有不同。是否存在绕过这种重复的方法?
我采用的方法是使用自定义绑定和订阅。这个解决方案使用了一个想法,从这个问题/答案在这里:如何定义一个自定义绑定谁使用以前的值来确定类在Knockout?
我在这里创建了一个新的提琴:http://jsfiddle.net/joshnicholson/F4bds/1
这是小提琴的Javascript摘录。最好访问链接查看完整示例:
function subscribeToPreviousValue(observable, fn) {
observable.subscribe(fn, this, 'beforeChange');
}
function isInvalid(expression) {
return expression === 'invalid';
}
function data(sno, exp) {
var self = this;
self.sno = ko.observable(sno);
self.exp = ko.observable(exp).extend({throttle: 200});
self.writeCount = ko.observable(0);
self.output = ko.observable("");
self.log = function(msg) {
var content = self.output();
self.output(content + "> " + msg + "<br />");
};
}
ko.bindingHandlers.bindingWithPrevValue = {
init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
var vm = bindingContext.$data,
observable = valueAccessor(),
current = observable();
vm.log('Initial value is ' + current);
subscribeToPreviousValue(observable, function (previous) {
var newValue = element.value;
if(isInvalid(previous)) return;
vm.log('');
vm.log('value changed from ' + previous + ' to ' + newValue);
if(isInvalid(newValue)) {
vm.log(newValue + ' is not valid. reverting...');
observable(previous);
}
});
}
};
ko.applyBindings(new data("000-11-2222", "testexp"));
在HTML中:
input type="text" data-bind="value: exp, bindingWithPrevValue: exp"/>
相关文章:
- 使用javascript搜索具有用户输入的数组
- React Native通过Navigator将用户输入数据传递到选项卡栏IOS中的组件
- 我想在AngularJS应用程序中创建一个输入数字框,用户不应该在该框上键入十进制数字.(一个整数输入框)
- 如何使用JavaScript中的用户输入创建序列/序列
- 如何在用户输入时实例化数组
- 如何从客户端的数组中获取用户输入和返回值
- 如何在用户输入 javascript 时更改值
- 如何从多个不同的html页面获得mongodb文档的用户输入
- 阻止用户将脚本输入wordpress post
- PayPal按钮是否有一个简单的选项,其中金额基于一些用户输入
- 从表单中获取用户输入执行计算(操作顺序)并输出回该表单
- 我确实有一个表单,如果用户输入了输入,它应该检查否定或空的输入框,并抛出一条警告消息
- 用于输入用户信息的动态PHP代码
- 在MongoDB中输入用户名数组,并返回相同大小的id数组,对于不存在的用户名为null或false
- 如何通过文本字段输入用户数据,然后在文本字段的正下方显示
- 脚本自动输入用户凭据
- 如何获取用户文本输入用户创建输入的值,jQuery
- 在网站服务器上存储表单/输入/用户首选项数据有哪些不同的方法?
- 使用if语句输入用户文本
- 不能在indexedDB中输入用户信息后立即提取用户信息