Knockoutjs checkbox validaton using subscribe
Knockoutjs checkbox validaton using subscribe
我正在尝试验证是否应该选中复选框,我正在使用订阅,但我不确定为什么它不起作用,我尝试了类似的逻辑与文本字段并且它有效。 我创建了一个小演示:
<input type ="checkbox" data-bind="checked: IsSelected"/>
<input type ="text" data-bind="value: Name"/>
var model = {
IsSelected : ko.observable(false),
Name: ko.observable("")
}
var demo = 1;
model.IsSelected.subscribe(function(value){
if (demo == 2 && value){
model.IsSelected(false);
}
demo = 2;
});
model.Name.subscribe(function(value){
if (value == "Set"){
model.Name("Jose");
}
})
ko.applyBindings(model);
http://jsfiddle.net/Xepe/9YXTW/
我不确定我是否做错了什么。
提前谢谢。
我认为该事件在浏览器更新复选框之前触发,因此即使false
IsSelected
它最终看起来也处于选中状态。 一种解决方法是使用 _.delay
或 setTimeout
来延迟将复选框恢复为 false:
model.IsSelected.subscribe(function(value){
if (demo == 2 && value){
setTimeout(function () { model.IsSelected(false); }, 0);
}
demo = 2;
});
http://jsfiddle.net/9YXTW/17/
恕我直言,我不知道你想从你的代码中做什么。但是,根据您的评论:
我创建此方案是因为我有一个复选框列表,如果选择了其中 2 个,则不应选择另一个。
和你的小提琴,我创造了这个:
(小提琴)
function CheckboxedTextbox(checkboxValue, textboxValue) {
this.textboxValue = ko.observable(textboxValue);
this.checkboxValue = ko.computed(function() {
return this.textboxValue();
}, this);
this.isSelected = ko.observable(checkboxValue);
}
function ViewModel() {
this.checkboxes = ko.observableArray([
new CheckboxedTextbox(false),
new CheckboxedTextbox(true, "Default value?"),
new CheckboxedTextbox(false)
]);
this.valid = ko.computed(function() {
return this.checkboxes().filter(function(c) {
return c.isSelected();
}).length <= 2;
}, this);
}
ko.applyBindings(new ViewModel());
这将简单地告诉您是否选择了太多。 通知用户验证约束可能是比自动取消选中的复选框更好的用户体验模式。但是,如果您只想强制一次检查,我会使用更改处理程序并跟踪最近的更改,将其添加到您的视图模型中:
(小提琴)
this.lastChangedBox = ko.observable();
this.forceQuantityChecked = function(newlyChecked) {
setTimeout(function() {
if (!this.valid()) {
this.checkboxes().filter(function(c) {
return c.isSelected() && c !== this.lastChangedBox() && c !== newlyChecked;
}.bind(this)).forEach(function(c) {
c.isSelected(false);
});
}
this.lastChangedBox(newlyChecked);
}.bind(this), 0);
};
在那里,我们确实看到了setTimeout
的必要性。
这里最重要的事情是数据是好的,这就是为什么我们使用observable
s和computed
s:任何像"是否选中了太多复选框"这样的想法都可以表示为一组相互关联的数据:一个复选框数组,是否选中了每个复选框,以及描述框当前状态有效性的属性。
相关文章:
- issue with FB.Event.subscribe
- 如何通过引用var Using DataTables来进行分页或排序
- Object.prototype using 'this'
- using LocalStorage ionic 2
- jQuery Replacing, Using arrays
- Using jQuery with classes from ES6
- Dropdownlist using javascript
- BOOMR.subscribe函数未执行
- <上的applyBindings();选择>正在导致我的subscribe()起火,
- Tic-Tac-Toe using React JS
- 在jqueryui中更改关键字using
- Using php mktime()
- Twitter api using Javascript
- Bootstrap-Datepicker not selecting date when using "set
- fetch data from db using javascript & php
- FB.Event.subscribe auth.statusChange未在Angular JS中启动
- Using closures in node js
- googleTagManager using JQueryMobile
- Javascript Object - using jQuery and this
- Knockoutjs checkbox validaton using subscribe