【问题标题】:ng-repeat Circular Reference Screen Refreshng-repeat 循环参考屏幕刷新
【发布时间】:2014-07-22 00:07:21
【问题描述】:

我是 AngularJS 的菜鸟。作为一项学习练习,我正在创建一个预先输入控件。

预输入由一个用于过滤选项的文本框、一个用于显示候选选项菜单的无序列表和一个用于手动切换列表的显示/隐藏按钮组成。

文本框使用 ng-repeat 过滤 li 元素。从列表中选择一个 li 项目时,我会使用所选值填充文本框,然后隐藏列表。

<div class="xtab-typeahead" ng-controller="xTabTypeAheadCtrl">

  <input type="text" class="xtab-typeahead-search" placeholder="{{type}}" ng-model="query.id" ng-focus="showMenu()" ng-init="query.id = undefined" />
  <button ng-click="toggleMenu()">Show/Hide</button>

  <ul class="xtab-typeahead-menu" ng-class="{true:'active',false:''}[isActive]">
    <li ng-repeat="item in menuItems | filter:query" 
        ng-click="hideMenu(); query.id = item.id">
      {{item.id}}
    </li>
  </ul>

</div>

我的问题是,当将值分配给文本框时,在隐藏菜单之前,列表会暂时过滤为选择的一个选项(因为文本框也是 ng-repeat 过滤器的来源)。我希望隐藏菜单的 id 而不先用过滤器刷新。

应该注意,这只发生在使用我用来淡出菜单的 CSS 过渡时。

这里有一个plnkr 来说明。

【问题讨论】:

    标签: angularjs angularjs-ng-repeat


    【解决方案1】:

    这是一个有效的Plnkr。在设置值之前,我基本上给了你的菜单时间来完成它的动画。相关代码如下:

    $scope.selectItem = function(id){
        $scope.isActive = false;
        $timeout(function(){
            $scope.query.id = id;
        }, 250);
    }
    

    ...以及使用新创建的 selectItem 方法的 HTML:

    <div class="xtab-typeahead" ng-controller="xTabTypeAheadCtrl">
    
      <input type="text" class="xtab-typeahead-search" placeholder="{{type}}" ng-model="query.id" ng-focus="showMenu()" ng-init="query.id = undefined" />
      <button ng-click="toggleMenu()">Show/Hide</button>
    
      <ul class="xtab-typeahead-menu" ng-class="{true:'active',false:''}[isActive]">
        <li ng-repeat="item in menuItems | filter:query" 
            ng-click="selectItem(item.id)">
          {{item.id}}
        </li>
      </ul>
    </div>
    

    【讨论】:

    • 谢谢。这行得通,但我不禁觉得它在某种程度上对 Angular 起作用。我采用的一般方法是否可能不是最佳实践,因此需要这种补救技术?
    • 我相信你的预感是正确的。通常这种行为被封装在一个指令中。由于您已将其组件分解到视图中,这就是使其工作所需的。如果您的问题与使指令正常工作有关,那么答案会有所不同。很高兴这对你有用。
    猜你喜欢
    • 1970-01-01
    • 2019-02-03
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    相关资源
    最近更新 更多