【发布时间】:2013-08-20 01:41:20
【问题描述】:
我有一个表单,用户应该在其中输入大量重复的数据实例,我希望用户能够以最小的努力做到这一点。它有点类似于巫师。
我希望用户在完成所有输入和选择后不需要单击单独的按钮,而是在表单完成时自动提交表单。
我使用带有options 绑定的淘汰赛。我目前的做法是使用敲除computed,它会检查表单中的所有字段,并在所有字段都具有有效值时自动提交。
我的实际表单和验证代码有点复杂,但这个简化的示例显示了我想要实现的目标:
<input type="text" id="theText" data-bind="value: text" />
<select id="theSelect" data-bind="options: options, value: selected, optionsText: 'text', optionsCaption: 'Please select'">
</select>
<div id="added" data-bind="foreach: added">
<span data-bind="text: text"></span>:<span data-bind="text: selected.text"></span><br/>
</div>
以及对应的javascript:
function ViewModel() {
var self = this;
this.text = ko.observable('');
this.selected = ko.observable(null);
this.added = ko.observableArray([]);
this.options = [{value: 1, text: "Number one"}, {value: 2, text: "Number two"}, {value: 3, text: "Number three"}];
this.add = ko.computed(function() {
var text = self.text();
var selected = self.selected();
if (text !== '' && selected) {
self.added.push({
text: text,
selected: selected
});
self.text('');
self.selected(null);
}
});
}
ko.applyBindings(new ViewModel());
jsFiddle here 显示此示例。当文本字段和选择都具有值时,将在它们下方添加一个新行并将它们重置为空。
这种方法或多或少有效,但有点神奇。当我尝试使此表单仅可用于键盘时,它也给我带来了一些问题(为用户提供更高的工作速度)。
有关此方法的问题示例,请尝试在文本框中输入内容并使用 Tab 键移动到选择。然后尝试使用键箭头更改所选值。由于这将触发更改事件,因此将立即选择第一个选项。 I have another question about this specific problem here
有没有更好的方法来实现淘汰赛中的自动提交时一切都有效?
我并不是要求对箭头键选择问题提供完整的解决方案,而只是要求我可以使用一些替代的起点。 ko.computed() 的替代品。
【问题讨论】:
-
你的方法在我看来在技术上是可靠的。您对此有何保留?此外,如果您主要关注这是否是好的用户体验,您可能会在我们的姊妹网站UX.StackExchange 上获得更好的运气。
-
@Jeroen 这种方法在这个简单的例子中是可靠的。只要用户是用鼠标点击选择,然后点击正确的选项。但是,当我尝试添加仅使用键盘进行导航的可能性时,我被卡住了。
-
您可能希望在文本输入为空时添加
hasFocus属性以自动对焦。为了键盘的可用性,您需要添加一个提交按钮,否则切换到选择并按下是提交它。 -
@FakeRainBrigand 实际表单对所有元素都使用
hasfocus绑定,但我试图将示例简化为基本要素。 -
我知道你有两个关于这个话题的问题,但你遇到的问题是一个非常“小众”的问题,如果不为你做大量的工作,很难给出建议。您是否考虑过为此问题创建自己的自定义绑定处理程序?我认为这将是一个完美的选择。