Javascript 如何在用户键入$viewValue时获取该字符串?

Javascript 如何在用户键入$viewValue时获取该字符串?,javascript,angularjs,angular-ui,angular-ui-typeahead,Javascript,Angularjs,Angular Ui,Angular Ui Typeahead,我是Angular的新手,正在尝试创建一个typeahead输入,它只显示以用户正在键入的内容开头的结果。例如,在我的plunker中,当用户键入“n”时,所有包含“n”的结果都会显示,而不仅仅是以字母开头的结果 我一直在尝试获取$viewValue,并将其与可以显示给用户的结果列表进行比较。 我还尝试用多种方式查看当前值,包括{{$viewValue}}等,但没有正确地这样做 那么最终,我需要什么才能查看和使用(可能是某种比较方法)输入到typeahead输入框中的字符串呢 Plunker链接

我是Angular的新手,正在尝试创建一个typeahead输入,它只显示以用户正在键入的内容开头的结果。例如,在我的plunker中,当用户键入“n”时,所有包含“n”的结果都会显示,而不仅仅是以字母开头的结果

我一直在尝试获取$viewValue,并将其与可以显示给用户的结果列表进行比较。 我还尝试用多种方式查看当前值,包括{{$viewValue}}等,但没有正确地这样做

那么最终,我需要什么才能查看和使用(可能是某种比较方法)输入到typeahead输入框中的字符串呢

Plunker链接:


{{selectedCenter | json}}
输入={{$scope.viewValue}}

感谢您提供的任何见解。

更新:我最初误读了这个问题(很抱歉)-您需要进行子字符串匹配,以检查列表项是否以输入的查询开始,而不是包含。我已经相应地更新了代码——我们现在将一个自定义函数传递给“过滤器”过滤器(请参阅文档中的参数表)。这里我只是做一个简单的子字符串匹配——如果不是ng show,它实际上会在一个空白查询中显示整个列表。将执行您使用的自定义函数,并将数组元素作为参数—fn返回“true”的每个项都包含在结果中


至于显示列表,这是Angular的一个很好的候选者。但是,如果您需要触发一个函数来进行服务器调用以首先填充列表,则ng更改将起作用

我写了一个又快又脏的例子来说明我在说什么。搜索查询的ng模型、过滤器、当查询为空时隐藏列表的ng show和触发递增“changes”计数器的简单函数的ng change。我直接在视图中使用过滤器,但您也可以通过在代码中使用它

注意:在对象的作用域中封装任何原语总是一个好主意,这样它就可以很好地处理继承-在下面的示例中,我使用“controller as”语法来实现这一点,而不仅仅是使用ng model=“query”。在这种情况下,您可以通过“this.query”从控制器访问数据

angular.module('app',[]).controller('MainController',function($scope){
var ctrl=this;
ctrl.query='';
ctrl.list=['foo'、'bar'、'baz'、'豪猪'、'大猩猩'、'羊驼'];
ctrl.changes=0;
this.beginsWith=函数(val){
返回值(angular.lowercase(val.substr(0,ctrl.query.length))
==angular.lowercase(ctrl.query));
};
});

当查询为空时,列表被ng show隐藏,所以它只显示匹配项。

数组:{main.list | json}

更改:{{main.Changes} | 当前查询文本:{main.query}
  • {{item}

感谢您的回复。在我的Spkes中,我已经很好地理解了这个列表,现在我只需要向用户展示从输入到Type的输入中输入的结果,而不是在中间或末尾输入任何结果的结果。在您的示例中,如果只键入a,则只需要羊驼,但也会显示bar、baz和gorilla。也许这个问题的答案就在你的帖子里,而它就在我的脑海里?再次感谢。啊,对不起,我想那是我阅读理解的失败。如果您查看我在上面链接到的文档,过滤器允许您传入一个函数来进行自己的比较,而不是使用它们的内置行为。该函数针对集合中的每个元素执行,并作为参数传递给该成员。函数返回“true”的每个元素都包含在结果中。我将相应地更新我的代码片段。为什么没有理由就投票否决?如果我需要编辑一些东西,我会的。
 <body ng-controller="MainCtrl" class="container-fluid">
    <input type="text" class="form-control" placeholder="Centers loaded from local database"
        ng-model="selectedCenter"
        typeahead-min-length="2"
        typeahead="center as center.name for center in centers | filter:{state:$viewValue}"
        typeahead-template-url="typeahead-item.html" />
    <pre>{{selectedCenter | json}}</pre>
    input = {{$scope.viewValue}}
  </body>