Javascript AngularJS typeahead添加自定义排序依据函数

Javascript AngularJS typeahead添加自定义排序依据函数,javascript,angularjs,angular-ui-bootstrap,typeahead,bootstrap-typeahead,Javascript,Angularjs,Angular Ui Bootstrap,Typeahead,Bootstrap Typeahead,我正在尝试构建一个typeahead,它应该获得指定数量的结果,并按startswith对它们进行排序 这意味着如果我有值:阿拉巴马州、密苏里州、马里兰州、马萨诸塞州等,并在输入字段中键入“m”或“m”,则顺序应为马里兰州、密苏里州、马萨诸塞州、阿拉巴马州 因此,我的代码如下所示: <input class="input-large" type="text" ng-model="selected" typeahead="state for state in states | filt

我正在尝试构建一个typeahead,它应该获得指定数量的结果,并按startswith对它们进行排序

这意味着如果我有值:阿拉巴马州、密苏里州、马里兰州、马萨诸塞州等,并在输入字段中键入“m”或“m”,则顺序应为马里兰州、密苏里州、马萨诸塞州、阿拉巴马州

因此,我的代码如下所示:

<input class="input-large" type="text" ng-model="selected" 
  typeahead="state for state in states | filter:$viewValue | limitTo:8">
这不起作用,因为选择的范围值
未更新,如图所示

是否有任何解决方案可以获得所需的订单?

将$viewValue传递给order by函数,并使用它对结果进行排序

<input class="input-large" type="text" ng-model="selected" typeahead="state for state in states | filter:$viewValue | orderBy:orderByStartsWith($viewValue) | limitTo:8">

 $scope.orderByStartsWith = function(viewValue) {
      return function(element){
        return element.toLowerCase().startsWith(viewValue.toLowerCase()) ? 0 : 1;           
      }
    };

$scope.orderByStartsWith=函数(viewValue){
返回函数(元素){
返回元素.toLowerCase().StartWith(viewValue.toLowerCase())?0:1;
}
};
检查小提琴:

你能举一个更完整的例子吗?当你输入“Ma”时,小提琴显示了你所期望的。谢谢你没有看到这个。我改变了问题。如果你只输入“m”或“m”,你应该知道问题出在哪里,因为当我尝试时,阿拉巴马州总是排在第二位,解决了它。谢谢你也许我不理解orderBy,但是你如何比较标准JS
sort(function(a,b){…})
方法中的两个元素呢?
$scope.orderByStartsWith = function() {
    return function(element){
        return element.toLowerCase().startsWith($scope.selected.toLowerCase()) ? 0 : 1;         
    }
};
<input class="input-large" type="text" ng-model="selected" typeahead="state for state in states | filter:$viewValue | orderBy:orderByStartsWith($viewValue) | limitTo:8">

 $scope.orderByStartsWith = function(viewValue) {
      return function(element){
        return element.toLowerCase().startsWith(viewValue.toLowerCase()) ? 0 : 1;           
      }
    };