【问题标题】:Unexpected Behavior in typeahead - is this a bug?预输入中的意外行为 - 这是一个错误吗?
【发布时间】:2017-04-08 09:36:39
【问题描述】:

我有一个使用 typeahead 的输入,如下所示:

<input type="text" id="unit" name="unit" class="form-control form-input" ng-model="item.unit"
            autocomplete="off" 
            typeahead-min-length="0" 
            uib-typeahead="unit as unit.symbol for unit in units | typeaheadFilter:{'symbol':$viewValue} | orderBy:smartOrder" 
            typeahead-template-url="unit-template.html" />

这是模板:

<script type="text/ng-template" id="unit-template.html">
    <a tabindex="-1">
        <div class="row">
            <span class="col-md-6 col-sm-6" ng-bind-html="match.model.symbol | uibTypeaheadHighlight:query"></span>
            <span class="col-md-5 col-sm-5 col-md-offset-1 col-sm-offset-1" ng-bind-html="match.model.name  | uibTypeaheadHighlight:query"></span>
        </div>
    </a>
</script>

我的单位收藏有两个项目:

name=kilogram symbol=kg
name=litre symbol=L

乍一看,我认为预输入工作正常。

但是当我尝试下面的组合键时,我发现了一个错误。

案例:1

工作:

当我在 typeahead 中输入 kg 并按两次 tab 时,item.unit 属性具有值:

Object {_id: "58cd0cdf28ea727c68be7ac3", name: "Kilogram", symbol: "kg", numberOfDecimalPlaces: 3, isSystemUnit: false…}

不工作:

但是当我在 typeahead 中输入 kg 并点击 esc 然后点击 tab 时,item.unit 属性具有值:

kg

案例:2

工作:

当我在 typeahead 中输入 kg 并按两次 tab 时,焦点会从控件上移开。现在 item.unit 属性具有值:

Object {_id: "58cd0cdf28ea727c68be7ac3", name: "Kilogram", symbol: "kg", numberOfDecimalPlaces: 3, isSystemUnit: false…}

然后,如果我使用 deletebackspace 键删除预先输入的文本,那么如果我将焦点从预先输入的位置移开,那么 item.unit 是

undefined.

不工作:

当我在 typeahead 中输入 kg 并按两次 tab 时,焦点会从控件上移开。现在 item.unit 属性具有值:

Object {_id: "58cd0cdf28ea727c68be7ac3", name: "Kilogram", symbol: "kg", numberOfDecimalPlaces: 3, isSystemUnit: false…}

然后,如果我通过选择文本然后使用 deletebackspace 键来删除预输入中的文本,那么我将焦点从预输入移开,然后是 item.unit仍然有价值:

Object {_id: "58cd0cdf28ea727c68be7ac3", name: "Kilogram", symbol: "kg", numberOfDecimalPlaces: 3, isSystemUnit: false…}

我还在他们的github page 上提出了一个问题。

Plunker:

这里是重现问题的 plunker 的链接:https://plnkr.co/edit/FIPANC3CcliNOeHHANxF

【问题讨论】:

  • 注意“公斤”应该是“公斤”
  • 如果可能,创建一个 plunker/fiddle?
  • 我认为 esc 会从输入中移除焦点,然后选项卡将无法按照您希望的方式工作。还需要一个小提琴,这样我就可以自己看到了。
  • @tanmay 我已经用 plunker 链接更新了我的问题。
  • @praszyk 我用 plunker 链接更新了我的问题。

标签: javascript angularjs angular-ui-bootstrap typeahead angular-ui-typeahead


【解决方案1】:

我没有看到预先输入的错误

  • 非工作案例 1 中:您实际上是在说取消预先输入(这是 esc 所做的),然后您的代码说显示绑定到input 元素,在这种情况下,它就是您输入的任何内容 - “kg”。这是预期的行为(对于给定的代码)。

    换句话说,如果没有安装预输入,您将得到完全相同的结果。

  • 非工作情况 2 中,这取决于您在删除后如何离开 - 如果您使用 tab 两次,则预先输入的默认建议为'kg' 所以首先 tab 选择它,然后第二个移动焦点,所以我希望它被设置为 'kg' 对象。但是,如果您在删除/退格后单击其他位置,则该值为空字符串 '',这也是我所期望的,因为您正在显示绑定到 input 的属性。

所以真正的问题是,当这些事情发生时,你想发生什么?

编辑:

要在非工作情况 1 中返回匹配对象,您可以执行以下操作 - 如果 $scope.unit 未设置为对象,则在离开字段时在数组中执行查找:

$scope.unitLostFocus = function(unit) {
  if (typeof unit !== "object") { // typed text so try to match in our array
    var res = jQuery.grep($scope.units, function(n) {
      return ( n.symbol.toLowerCase() === unit.toLowerCase() );
    });
    if (res.length)
      $scope.unit = res[0]; // first match
    else 
      $scope.unit = undefined; // whatever you want to do here when there's no match
  }
  console.log($scope.unit);
};

更新的 Plunker:https://plnkr.co/edit/8YsecsgToP8dtwYHbhD4?p=preview

【讨论】:

  • 好的。如果您认为当前的 typeahead 行为很好,那么这不是我的要求。我的要求是:如果我输入 kg,然后按 esc 键,然后按 tab 键,我希望绑定到输入的变量的值是 Kilogram Object 而不是文本 kg。并且无法复制第二个非工作案例。我去看看。
  • 我从前四天开始工作。所以,我无法检查你的答案。现在,我检查了它。它工作正常。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2017-10-26
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 2015-07-30
  • 1970-01-01
相关资源
最近更新 更多