【问题标题】:Alternative way to detect changed select option in Knockout.js在 Knockout.js 中检测更改的选择选项的替代方法
【发布时间】: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 绑定,但我试图将示例简化为基本要素。
  • 我知道你有两个关于这个话题的问题,但你遇到的问题是一个非常“小众”的问题,如果不为你做大量的工作,很难给出建议。您是否考虑过为此问题创建自己的自定义绑定处理程序?我认为这将是一个完美的选择。

标签: javascript knockout.js


【解决方案1】:

您可以通过使用 throttle 扩展器扩展 computed 来延迟启动它。这意味着在computed函数运行之前,用户将有一定的时间通过向上/向下键选择适当的选项。

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); 
    }
}).extend({ throttle: 1000 }); 

1 秒足以在选项之间切换,因为每次按键后油门计时器都会重置。你可以试试here

附:我并不认为我的回答很有价值,但这是我对您的表单可能进行的改进的看法。此外,我认为我的改进对于只有少量选项(最多 7-10 个)的下拉菜单很有用。

【讨论】:

  • 这并不能回答我关于检测变化的替代方法的问题。但我很欣赏这个答案,它实际上为我已经回避了几天的另一个问题指出了正确的方向。
猜你喜欢
  • 2017-06-09
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多