【问题标题】:Show/Hide Div if autocomplete input is selected如果选择了自动完成输入,则显示/隐藏 Div
【发布时间】:2015-11-12 08:34:19
【问题描述】:

我有两个 Angular-Material 自动完成字段添加为 shown here,到目前为止它运行良好。

自动完成代码:

HTML:

<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.searchText2)"
    md-search-text="ctrl.searchText2"
    md-selected-item-change="ctrl.selectedItemChange(item)"
    md-items="item in ctrl.querySearch(ctrl.searchText2)"
    md-item-text="item.display"
    md-min-length="1"
    md-floating-label="Destination"
    ng-model="destiFlight">
    <md-item-template>
        <span md-highlight-text="ctrl.searchText" md-highlight-flags="^i">{{item.display}}</span>
    </md-item-template>
    <md-not-found>
        No states matching "{{ctrl.searchText}}" were found.
    </md-not-found>
    </md-autocomplete>
</form>

JS:

.controller('someCtrl', someCtrl);
  function someCtrl($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);
        };
    }
};

现在我在两个字段下方添加了一个 div,如下所示:

<div class="someDiv">
    ....
</div>

只有从自动完成下拉菜单中选择了一个值,我才能显示 div?

【问题讨论】:

  • 您是否尝试过使用ng-show 并将其设置为选定的值?您需要展示更多您所做的事情,以便全面了解哪些事情对您不起作用。
  • 另一种方式可以是$watch。设置一个标志说“来源”并在更改时检查并相应地处理它。
  • @Rajesh $watch 是如何工作的?我还在学习角度,所以请不要介意菜鸟问题。
  • @Andrew,没关系。 $watch 是变量的观察者。每当您的变量值发生变化时,它都会触发一个事件。此活动还使您可以访问旧值和新值。 $watch 的好处是,如果您的变量值从代码本身更改,仍然会触发此事件,因此您不必触发任何事件
  • @Rajesh 哦,我明白了。如何使用它进行自动完成?

标签: javascript angularjs autocomplete angular-material


【解决方案1】:

您应该使用为自动完成存储所选值的模型:

自动完成:

<md-autocomplete
      md-selected-item="mySelectedItem"
      md-items="item in myList"
      md-item-text="item.name"
      md-min-length="0"
      placeholder="Select country">

还有 div:

<div class="someDiv" ng-show="mySelectedItem && mySelectedItem.length != 0">
     ....
</div>

【讨论】:

  • 我尝试像这样戴安娜添加 ng-show: ng-show="ctrl.selectedItem.length != 0" 但即使选择了一个值,该框也会保持隐藏状态。顺便说一句,我已经用更多代码更新了这个问题。非常感谢您的帮助。
  • @AndrewLyndem 你能用你的问题创建 aplnkr 吗?
  • 戴安娜,我似乎无法使代码工作(在 plnkr 和 jsfiddle 上),即使它通过我的本地文件加载得很好:(这是 jsfiddle 的链接:@987654321 @
  • 嗯,我本地没有可用于测试的模板。是您特别感兴趣的自动完成功能,还是只需要自动完成功能?
  • 自动完成功能运行良好,戴安娜。但是只有在从自动完成字段中选择了一个值之后才出现一个 div 是我不幸遇到的问题:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 2013-11-30
相关资源
最近更新 更多