【问题标题】:Implementing angular material autocomplete search on enter在输入时实现角度材料自动完成搜索
【发布时间】:2016-02-02 04:11:41
【问题描述】:

我已经做了一个自动完成,点击一个按钮可以很好地从远程服务器获取所有关键结果。然而,要求是实现与自动完成栏上的输入功能相同的功能。

编辑:自动建议完美显示结果,我想收集搜索文本并在用户输入搜索框时在新页面上显示完整结果,否则只是自动建议中的摘要

navbar.html

...
    <div  ng-controller="AppCtrl as ctrl" >    
    <form ng-submit="$event.preventDefault()" style="width: 100%; background: transparent;" ng-controller="gotoSearchLanding">
                          <md-autocomplete
                              ng-disabled="ctrl.isDisabled"
                              md-no-cache="ctrl.noCache"
                              md-selected-item="ctrl.selectedItem"
                              md-search-text-change=""
                              md-search-text="ctrl.searchText"
                              md-selected-item-change="ctrl.selectedItemChange(item)"
                              md-items="item in ctrl.searchTextChange(ctrl.searchText)"
                              md-item-text="item.name"
                              md-min-length="0"
                              placeholder="Search Data"
                              ng-enter="gotoSearchLandingFun(ctrl.searchText)">>
                              <md-item-template>
                              <span class="item-title">
                                <img ng-src="img/jobs.png" width="20">
                                <span> {{item.name}} </span>
                              </span>
                              <span class="item-metadata">
                                <span class="item-metastat">
                                  <strong>{{item.employee_id}}</strong> 
                                </span>
                                <span class="item-metastat">
                                  <strong>{{item.email}}</strong> 
                                </span>
                              </span>
                            </md-item-template>
                          </md-autocomplete>
                        </form>
                        <span ng-controller="gotoSearchLanding">
                         <md-button class="md-fab md-mini" style="background-color:#fff" aria-label="Eat cake"  ng-click="gotoSearchLandingFun(ctrl.searchText)">
                            <ng-md-icon icon="search"></ng-md-icon>
                        </md-button>   
                        <span>
    </div>

controller.js

/**
 * Auto Search App Controller
 */

angular.module('AppTool')
  .controller('AppCtrl', [ '$http', '$state', AppCtrl]);
  function AppCtrl ($http, $state) {
    var self = this;      
    self.simulateQuery = false;
    self.isDisabled    = false;
    self.querySearch   = querySearch;
    self.selectedItemChange = selectedItemChange;
    self.searchTextChange   = searchTextChange;
    function querySearch (query) {
      var results = query ? self.repos.filter( createFilterFor(query) ) : self.repos,
          deferred;
      if (self.simulateQuery) {
        deferred = $q.defer();
        $timeout(function () { deferred.resolve( results ); }, Math.random() * 1000, false);
        return deferred.promise;
      } else {

        return results;
      }
    }

    function searchTextChange(text) {
     return $http.get('http://localhost:3000/search', {
        params: {
          q: text
        }
      }).then(function(response){
        return response.data.map(function(item){
          return item._source;
        });
      }, function (error) {
          console.log("error");
      });
    }

    function selectedItemChange(item) {
    }

    function createFilterFor(query) {
      var lowercaseQuery = angular.lowercase(query);
      return function filterFn(item) {
        return (item.value.indexOf(lowercaseQuery) === 0);
      };
    }
}

gotsearchlandingCtrl.js

angular.module('AppTool')
    .controller('gotoSearchLanding', ['$scope','$state', gotoSearchLanding]);

function gotoSearchLanding($scope, $state) {

 $scope.gotoSearchLandingFun = function($val) {
        alert($val);  
        $state.go("searchLanding", { searchVal: $val});
    };     
}

directive.js

angular.module('PdbTool')
.directive('myEnter', function () {
    return function (scope, element, attrs) {
        element.bind("keydown keypress", function (event) {
            if(event.which === 13) {
                scope.$apply(function (){
                    scope.$eval(attrs.myEnter);
                });
                event.preventDefault();
            }
        });
    };
});

【问题讨论】:

  • 正如您在这里所观察到的那样:material.angularjs.org/latest/demo/autocomplete 它也适用于 Enter
  • 哪个例子?基本或自定义..仅显示下拉自动建议,它在单击任何显示数据的选项时工作..我想收集值并将所有可能的结果放在另一个页面上。

标签: javascript angularjs material-design angular-material


【解决方案1】:

在 md-autocomplete 标记中使用您的指令 myEnter。

这是我修改后的代码:

directives.myEnter = function () {
  return function (scope, element, attrs) {
      element.bind("keydown keypress", function (event) {
          if(event.which === 13) {
              scope.$apply(function () {
                  scope.gotoSearchLandingFun(scope.searchText);
              });
              event.preventDefault();
          }
      });
  };

}

和自动完成 HTML:

<md-autocomplete  class="search_box"
                          md-selected-item="selectedItem"
                          md-search-text="searchText"
                          md-items="item in querySearch(searchText)"
                          md-search-text-change="querySearch(searchText)"
                          md-selected-item-change="search(searchText)"
                          md-item-text="item.value"
                          md-min-length="2"
                          md-autofocus="true"
                          md-no-cache="false"
                          placeholder="Search..." my-enter>
            <md-item-template>
                <span>{{item.value}}</span>
            </md-item-template>
            <md-not-found>
                No matches found.
            </md-not-found>
        </md-autocomplete>

由于 myEnter 范围在您的主要功能范围内,您可以调用它们,如示例中所示。

【讨论】:

    【解决方案2】:

    如果您使用以下自动完成属性,您可以让 Enter 键选择表单帖子上的项目:

    md-require-match="true"
    md-select-on-match="true"
    md-match-case-insensitive="true"
    md-selected-item="selectedItem"
    

    【讨论】:

      猜你喜欢
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多