【问题标题】:Bind value of selected dropdown value from one autocomplete field to another with angularJS使用 angularJS 将选定下拉值的值从一个自动完成字段绑定到另一个
【发布时间】:2016-02-07 05:08:13
【问题描述】:

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

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

所有三个字段的自动完成看起来像这样,但每个字段都包装在各自独立的控制器中:

<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);
        };
    }
}; 

【问题讨论】:

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


    【解决方案1】:

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

    所以在你的函数selectedItemChange中,设置代表第三个autocompletefield的模型。

    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);
            };
        }
    }
    

    【讨论】:

    • “所以在你的函数selected-Item-Change中,设置代表第三个autocomplete字段的模型”所以我应该在我复制Rayon的当前js下方或上方添加上述函数?
    • 顺便说一句,我刚开始学习 angularJs,所以请不要介意菜鸟问题。
    • 只需设置第三个元素的值modelselectedItem
    • 所以这个md-selected-item-change="ctrl.selectedItemChange(item)" 将是md-selected-item-change="newState" 还是?
    • ctrl.selectedItemChange(item) 是一个被调用的方法,它有参数作为选择的值。只需将此值设置为第三元素模型。不要把事情复杂化...
    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 2015-04-10
    • 2020-05-24
    • 1970-01-01
    • 2014-06-21
    相关资源
    最近更新 更多