使用angularJS

时间:2015-11-06 05:43:44

标签: javascript angularjs autocomplete material-design angular-material

在官方Angular-Material Docs found here的帮助下,我设法将三个自动填充字段彼此相邻添加。但是,我想将从第一个下拉字段中选择的值绑定到第三个下拉字段上自动选择。

将第一个自动完成值绑定到第三个的最佳方法是什么,但 NOT 反之亦然?

所有三个字段的自动完成都是这样的,但每个字段都包含在各自独立的控制器中:

<form ng-submit="$event.preventDefault()">
    <md-autocomplete
        ng-disabled="ctrl.isDisabled"
        md-no-cache="ctrl.noCache"
        md-selected-item="ctrl.selectedItem"
        md-search-text-change="ctrl.searchTextChange(ctrl.searchText)"
        md-search-text="ctrl.searchText"
        md-selected-item-change="ctrl.selectedItemChange(item)"
        md-items="item in ctrl.querySearch(ctrl.searchText)"
        md-item-text="item.display"
        md-min-length="1"
        md-floating-label="Final">
        <md-item-template>
            <span md-highlight-text="ctrl.searchText" md-highlight-flags="^i">{{item.display}}</span>
        </md-item-template>
        <md-not-found>
            No items matching "{{ctrl.searchText}}" were found.
        </md-not-found>
    </md-autocomplete>
</form>

我从示例文档中复制的JS:

app.controller('abcCtrl', abcCtrls);
    function abcCtrls ($timeout, $q, $log) {
        var self = this;
        self.simulateQuery = false;
        self.isDisabled    = false;
        // list of `state` value/display objects
        self.states        = loadAll();
        self.querySearch   = querySearch;
        self.selectedItemChange = selectedItemChange;
        self.searchTextChange   = searchTextChange;
        self.newState = newState;
        function newState(state) {
          alert("Sorry! You'll need to create a Constituion for " + state + " first!");
        }
        // ******************************
        // Internal methods
        // ******************************
        /**
         * Search for states... use $timeout to simulate
         * remote dataservice call.
         */
        function querySearch (query) {
          var results = query ? self.states.filter( createFilterFor(query) ) : self.states,
              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) {
          $log.info('Text changed to ' + text);
        }
        function selectedItemChange(item) {
          $log.info('Item changed to ' + JSON.stringify(item));
        }
        /**
         * Build `states` list of key/value pairs
         */
        function loadAll() {
          var allStates = 'Alabama, Alaska, Arizona, Arkansas, California, Colorado, Connecticut, Delaware,\
                  Florida, Georgia, Hawaii, Idaho, Illinois, Indiana, Iowa, Kansas, Kentucky, Louisiana,\
                  Maine, Maryland, Massachusetts, Michigan, Minnesota, Mississippi, Missouri, Montana,\
                  Nebraska, Nevada, New Hampshire, New Jersey, New Mexico, New York, North Carolina,\
                  North Dakota, Ohio, Oklahoma, Oregon, Pennsylvania, Rhode Island, South Carolina,\
                  South Dakota, Tennessee, Texas, Utah, Vermont, Virginia, Washington, West Virginia,\
                  Wisconsin, Wyoming';
          return allStates.split(/, +/g).map( function (state) {
            return {
              value: state.toLowerCase(),
              display: state
            };
          });
        }
        /**
         * Create filter function for a query string
         */
        function createFilterFor(query) {
          var lowercaseQuery = angular.lowercase(query);
          return function filterFn(state) {
            return (state.value.indexOf(lowercaseQuery) === 0);
        };
    }
}; 

1 个答案:

答案 0 :(得分:1)

  

md-selected-item-change是每次选择新项目时都要运行的表达式

     

因此,在您的函数selectedItemChange中,设置代表第三个autocomplete字段的模型。

<强> HTML

<div ng-app="myApp" ng-controller="abcCtrl as ctrl">
    <form ng-submit="$event.preventDefault()">
        <md-autocomplete ng-disabled="ctrl.isDisabled" md-no-cache="ctrl.noCache" md-selected-item="ctrl.selectedItem" md-search-text-change="ctrl.searchTextChange(ctrl.searchText)" md-search-text="ctrl.searchText" md-selected-item-change="ctrl.selectedItemChange(item)" md-items="item in ctrl.querySearch(ctrl.searchText)" md-item-text="item.display" md-min-length="1" md-floating-label="Final">
            <md-item-template><span md-highlight-text="ctrl.searchText" md-highlight-flags="^i">{{item.display}}</span>

            </md-item-template>
            <md-not-found>No items matching "{{ctrl.searchText}}" were found.</md-not-found>
        </md-autocomplete>
        <md-autocomplete ng-disabled="ctrl.isDisabled" md-no-cache="ctrl.noCache" md-selected-item="ctrl.selectedItem2" md-search-text-change="ctrl.searchTextChange(ctrl.searchText2)" md-search-text="ctrl.searchText2" md-items="item in ctrl.querySearch(ctrl.searchText2)" md-item-text="item.display" md-min-length="1" md-floating-label="Final">
            <md-item-template><span md-highlight-text="ctrl.searchText" md-highlight-flags="^i">{{item.display}}</span>

            </md-item-template>
            <md-not-found>No items matching "{{ctrl.searchText}}" were found.</md-not-found>
        </md-autocomplete>
        <md-autocomplete ng-disabled="ctrl.isDisabled" md-no-cache="ctrl.noCache" md-selected-item="ctrl.selectedItem3" md-search-text-change="ctrl.searchTextChange(ctrl.searchText3)" md-search-text="ctrl.searchText3" md-items="item in ctrl.querySearch(ctrl.searchText3)" md-item-text="item.display" md-min-length="1" md-floating-label="Final">
            <md-item-template><span md-highlight-text="ctrl.searchText3" md-highlight-flags="^i">{{item.display}}</span>

            </md-item-template>
            <md-not-found>No items matching "{{ctrl.searchText3}}" were found.</md-not-found>
        </md-autocomplete>
    </form>
</div>

<强> JavaScript的:

var app = angular.module('myApp', ['ngMaterial']);
app.controller('abcCtrl', abcCtrls);

function abcCtrls($timeout, $q, $log) {
    var self = this;
    self.simulateQuery = false;
    self.isDisabled = false;
    // list of `state` value/display objects
    self.states = loadAll();
    self.querySearch = querySearch;
    self.selectedItemChange = selectedItemChange;
    self.searchTextChange = searchTextChange;
    self.newState = newState;

    function newState(state) {
        alert("Sorry! You'll need to create a Constituion for " + state + " first!");
    }

    // ******************************
    // Internal methods
    // ******************************
    /**
     * Search for states... use $timeout to simulate
     * remote dataservice call.
     */
    function querySearch(query) {
        var results = query ? self.states.filter(createFilterFor(query)) : self.states,
                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) {
        $log.info('Text changed to ' + text);
    }

    function selectedItemChange(item) {
        self.selectedItem3 = item;
        $log.info('Item changed to ' + JSON.stringify(item));
    }

    /**
     * Build `states` list of key/value pairs
     */
    function loadAll() {
        var allStates = 'Alabama, Alaska, Arizona, Arkansas, California, Colorado, Connecticut, Delaware,\
              Florida, Georgia, Hawaii, Idaho, Illinois, Indiana, Iowa, Kansas, Kentucky, Louisiana,\
              Maine, Maryland, Massachusetts, Michigan, Minnesota, Mississippi, Missouri, Montana,\
              Nebraska, Nevada, New Hampshire, New Jersey, New Mexico, New York, North Carolina,\
              North Dakota, Ohio, Oklahoma, Oregon, Pennsylvania, Rhode Island, South Carolina,\
              South Dakota, Tennessee, Texas, Utah, Vermont, Virginia, Washington, West Virginia,\
              Wisconsin, Wyoming';
        return allStates.split(/, +/g).map(function (state) {
            return {
                value: state.toLowerCase(),
                display: state
            };
        });
    }

    /**
     * Create filter function for a query string
     */
    function createFilterFor(query) {
        var lowercaseQuery = angular.lowercase(query);
        return function filterFn(state) {
            return (state.value.indexOf(lowercaseQuery) === 0);
        };
    }
}