简体   繁体   English

如何在网页中以单一形式和单一控制器实现angular js材质的两个md-autocomplete?

[英]How to implement two md-autocomplete of angular js material in single form and single controller in a web page?

I need two md-autocomplete in one page so according to angular js material document i include two md-autocomplete in my form, ones for vehicle make company name and other for vehicle model but when i choose a vehicle name from first md-autocomplete then second md-autocomplete appear a [object Object] value. 我需要在一页中包含两个md-autocomplete,因此根据角度js物料文档,我在表单中包括两个md-autocomplete,一个用于车辆制造公司名称,另一个用于车辆型号,但是当我从第一个md-autocomplete中选择一个车辆名称时,第二个md-autocomplete出现一个[object Object]值。 So how i will modify its js function? 那么我将如何修改其js函数?

<!--Html Code-->
<md-autocomplete  required='' ng-disabled="isDisabled" md-no-cache="noCache" md-selected-item="selectedItem" md-search-text-change="searchTextChange(searchText)" md-search-text="searchTextModel" md-selected-item-change="selectedItemChange(item)" md-items="item in querySearch(searchTextModel)" md-item-text="item.name" md-min-length="0" md-menu-class="autocomplete-custom-template"  md-floating-label="Make">
    <md-item-template>
        <span class="item-title">
        <md-icon md-svg-icon="img/icons/octicon-repo.svg"></md-icon>
        <span>{{item.name}}</span>
        </span>
    </md-item-template>
    <div ng-messages="userForm.autocomplete.$error">
        <div ng-message="required">This field is required</div>
    </div>
</md-autocomplete>


<md-autocomplete  required='' ng-disabled="isDisabled" md-no-cache="noCache" md-selected-item="selectedItemModel" md-search-text-change="searchTextChange(searchText)" md-search-text="searchText"  md-items="item in querySearchModel(searchText)" md-item-text="item.title" md-min-length="0" md-menu-class="autocomplete-custom-template"  md-floating-label="Model">
    <md-item-template>
        <span class="item-title">
        <span> {{item.name}} </span>
        </span>
    </md-item-template>
    <div ng-messages="userForm.autocomplete.$error">
        <div ng-message="required">This field is required</div>
    </div>
</md-autocomplete>




 //Angular js Controller code

  //Auto complete function for car make

  $scope.make=[{id:1,name:"Audi"},{id:2,name:"BMW"},{id:3,name:"Ferrari"}];
  $scope.selectedItem  = null;
  $scope.searchText    = null;
  $scope.querySearch   = querySearch;


   function querySearch (query) {

          var results = query ? $scope.categories.filter(createFilterFor(query)) : $scope.make,
                        deferred;
                    if (self.simulateQuery) {
                        deferred = $q.defer();
                        $timeout(function () {
                            deferred.resolve(results);
                        }, Math.random() * 1000, false);
                        return deferred.promise;
                    } else {
                        return results;
                    }

   }

   function createFilterFor(query) {
      var lowercaseQuery = angular.lowercase(query);

      return function filterFn(Make) {
        //alert(state);
        //console.log(state);
        return (Make.name.toLowerCase().indexOf(lowercaseQuery) === 0);
      };

    }


   //Auto complete function for car models
   $scope.model=[{mid:1,id:1,name:"Q3"},{mid:2,id:1,name:"Q6"},{mid:3,id:1,name:"Q2"}];
   $scope.selectedItemModel  = null;
   $scope.searchTextModel    = null;
   $scope.querySearchModel=querySearchModel;


   function querySearchModel (query) {

          var results = query ? $scope.model.filter(createFilterFor(query)) : $scope.model,
                        deferred;
                    if (self.simulateQuery) {
                        deferred = $q.defer();
                        $timeout(function () {
                            deferred.resolve(results);
                        }, Math.random() * 1000, false);
                        return deferred.promise;
                    } else {
                        return results;
                    }

   }


   function createFilterForModel(query) {
      var lowercaseQuery = angular.lowercase(query);

      return function filterFn(Model) {
       return (Model.name.toLowerCase().indexOf(lowercaseQuery) === 0);
      };

    }

I also had a similar issue and found your question. 我也遇到了类似的问题,并找到了您的问题。 On the first autocomplete you call searchTextChange(searchText) , but searchText is from the second autocomplete, while in the first you called it searchTextModel . 在第一个自动完成功能上,您调用searchTextChange(searchText) ,但是searchText来自第二个自动完成功能,而在第一个功能中,您将其称为searchTextModel


I found this because I had a problem on which multiple autocomplete on the same page where sharing the value. 我发现此问题是因为我在共享值的同一页面上有多个自动完成问题。 Your question help me found a solution. 您的问题帮助我找到了解决方案。 While in Bootstrap's typeahead you use $viewValue for any typeahead, on mdAutocomplete you specify which model to bind the searchText, and thus, you cannot use the same binding on all autocompletes, you have to have one for each. 在Bootstrap的预输入中,对于任何预输入都使用$viewValue ,而在mdAutocomplete您指定要绑定mdAutocomplete模型,因此,您不能对所有自动完成使用相同的绑定,每个都必须有一个绑定。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM