如何使用结果中的筛选器创建高级输入



我想在网站上做一些真正类似于"搜索"的东西http://www.jobs.cz/

它应该做什么:

  • 选择框显示用户对输入的关注
  • 用户可以在选择框中键入输入并过滤结果
  • 如果用户选择其中一个结果选择框隐藏
  • 如果用户再次输入焦点,选择框再次打开,用户可以选择另一个选项(选择为添加到上一个选项而不是重写上一个)
  • 如果他开始输入,无论已经选择了什么,它仍然会过滤(例如:他已经选择了"Administrativa",但如果他键入Auto,它会为他提供"Auto-Moto",换句话说,之前选择的值不应该用于筛选)
  • 每个拾取的值都应该处于某种"标记"模式(每个值都是独立的内联块并具有类)

在我继续之前,我不希望你为我制作整个代码,这将花费太长时间,我来这里不是为了代码,而是为了如何设计这样的东西。我一开始就有很多事情,只是不知道自己的想法是否正确,我需要帮助思考如何制作这样的东西。

所以我做了什么:

  • 打开/关闭选择框div:

输入看起来像:

<input id="position" placeholder="Position" ng-focus="focus=true" ng-blur="focus=false" ng-model="q">

然后像

<div class="inputHelper" ng-show="focus">
  • 筛选结果:

基于角度文档过滤,ng重复应该通过非常容易地完成

<li ng-repeat="pos in listCtrl.positions | filter:q as results" ng-click="listCtrl.choosePosition(pos)">{{pos.name}}</li>

然而,对于<input>上的ng-model="q",如果我向该模型推送一些东西,问题就会开始,就像之前从用户那里挑选的一样。如果用户已经选择了一些东西,我不知道如何处理过滤器。

  • 处理多个拾取

为此,我创建了一个数组,在那里我总是检查用户是否已经选择了它,如果没有将它推送到数组中。

choosePosition: function(position) {
if (listCtrl.chosenPosition.indexOf(position) === -1) {
listCtrl.chosenPosition.push(position);
}
}
  • 显示输入中的对象数组

我在文档中搜索了很多,并在谷歌上搜索了一个此类问题,我在输入中找到了基本的显示数组。我没有发现比这更有用的东西。所以在这一点上,我不知道如何显示对象数组,以及如何将每个数组元素设置为内联块并给它一些类。

摘要:

这是一篇很长的帖子,但我尽量说我需要做的一切,以避免错过理解,我在这里呆了几天,但我仍然被困在某个地方。我甚至不确定我是否设计得很好。如果这里有人可以帮助我完成部分可以工作的代码,或者至少试着解释我如何做这样的事情,我会非常感激

如果您的项目允许使用它,Angular Material的自动完成几乎是您所需的直接实现。

最新更新