【问题标题】:AngularJS : How to change a value in all items in an ng-repeatAngularJS:如何更改 ng-repeat 中所有项目的值
【发布时间】:2015-05-04 18:13:14
【问题描述】:

我有一个数据模型,默认情况下我给第一个股票一个选择的状态为真。

现在,当用户单击另一个项目时,我需要有效地取消选择所有其他项目并将所单击的项目的选定值设置为 true:

<li class="ticker-li"
    ng-repeat="ticker in tickers"
    ng-hide="ticker.removed"
    ng-class="{'selected':ticker.selected}"
    ng-mouseleave="hideTickerOptions()">

    <div class="ticker"
         ng-click="unselectAll(); ticker.selected = !ticker.selected;
                   selectTicker(ticker);">
         {{ticker.ticker}}
    </div>
</li>

在这里尝试了forEach 函数,但出现错误[object Array] is not a function

var vs = $scope;

vs.unselectAll = function() {
   vs.tickers.forEach(vs.tickers, function(ticker) {
       ticker.selected = false;
   });
};

常规的 for 循环可以工作,但将所有选定的值切换为 false 是否有效?

for (var i = 0; i < vs.tickers.length; i++) {
    vs.tickers[i].selected = false;
}

我的想法是运行这个 unselectAll 函数来取消选择所有内容,然后在标记中选择当前项目的下一个代码:

<div class="ticker"
     ng-click="unselectAll(); ticker.selected = !ticker.selected;
               selectTicker(ticker);">
     {{ticker.ticker}}
</div>

【问题讨论】:

    标签: javascript angularjs angularjs-ng-repeat angularjs-ng-model


    【解决方案1】:

    我尝试使用无线电输入来做到这一点。

     var app = angular.module('AppForm', []);
    
    app.controller('ctrForm', function ($scope) {
    
            $scope.choices = [
                { id: 'Choice1', check: false },
                { id: 'Choice2', check: false },
                { id: 'Choice3', check: false },
                { id: 'Choice4', check: false },
                { id: 'Choice5', check: false },
                { id: 'Choice6', check: false },
                { id: 'Choice7', check: false }
            ];
    
            $scope.setDefault = function (item) {
                angular.forEach($scope.choices, function (p) {
                    p.check = false; //set them all to false
                });
                item.check = true; //set the clicked one to true
            };
            
        });
    .selected {
            background-color: yellow;
        }
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.21/angular.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    
    <div ng-app="AppForm" ng-controller="ctrForm">
            <ul>
                <li style="list-style:none" ng-class="{'selected':item.check}" ng-repeat="item in choices"><input type="radio" name="group" ng-model="item.check" ng-click="setDefault(item)" value="true" />{{item.id}}...{{item.check}}</li>
            </ul>
        </div>

    【讨论】:

    • 很好 :) 感谢您的工作示例...我实际上使用了 for-loop,但稍后会对其进行测试以查看是否存在性能差异。
    • 对不起,我注意到今天有一个小错误。如果您找到解决方案,请告诉我。 :)
    【解决方案2】:

    foreach 的效率不会低于 Angular 可以“免费”做的任何事情。无论哪种方式,它都必须将其他设置为未选中..

    我的建议是拥有一个“selectedItem”和一组“items”。

    然后你可以'说'

    <li class="ticker-li"
        ng-repeat="ticker in tickers"
        ng-hide="ticker.removed"
        ng-class="{'selected':ticker == selectedTicker}"
        ng-mouseleave="hideTickerOptions()">
    
        <div class="ticker" ng-click="selectedTicker = ticker">
             {{ticker.ticker}}
        </div>
    </li>
    

    然后您可以访问 selectedTicker 以获取它的属性

    <div>{{selectedTicker.name}}</div>
    

    【讨论】:

    • 嗯,这仍然会保留所有先前选择的代码。
    • 它将保留选中状态,但我在想,不是检查 isSelected,而是检查它们是否等于 'selectedTicker'(请参阅中的 ng-class 标签我的代码)
    • 是的,这与我使用的 ng-class="{'selected':ticker.selected}" 基本相同,只需要一种方法来更新模型以在再次重新选择之前从所有项目中删除或更改 selectedselectedTicker
    • 我的建议是避免为每个项目选择设置。而是在每次更改选择时为所选对象设置一个新对象。然后判断是否选择了一个代码,您只需检查它是否等于选定的代码。这样,您在更改选择时就不必遍历所有代码。
    【解决方案3】:

    如果您设置使用ticker.selected,您可以使用jquery .each 循环来取消选择所有这些。

    $scope.selectTicker = function(ticker)
    {
      //deselect all tickers
      $.each(tickers, function() { this.selected = false; });
    
      //select the ticker you passed in
      ticker.selected = true;
    }
    

    在你看来:

    <div class="ticker"ng-click="selectTicker(ticker);">
         {{ticker.ticker}}
    </div>
    

    【讨论】:

    • 我绝对想避免使用 jQuery,在我学习 Angular 时,我曾经依赖它作为拐杖。我认为它开始看起来像 for-loop 是最简单的方法。
    • 当人们说不要使用带有角度的 jquery 时,他们的意思是不要使用 jquery 的 DOM 操作东西。并不是说您需要避免所有的 JQuery。无论如何:angular 有一个 foreach 的工作原理完全相同 docs.angularjs.org/api/ng/function/angular.forEach
    • 是的,不过我的想法是让应用程序尽可能轻巧,这样用户所需的下载量就最少。我尝试了上面的 Angular forEach,但出现错误:(
    • 我真的很喜欢这个有一段时间(保持轻松)但实际上,如果你链接到一个缩小的 jquery 源,与他们拉下你的用户相比,它至少不会减慢用户的速度来自您的服务器的实际应用程序。
    猜你喜欢
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 2015-09-20
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    相关资源
    最近更新 更多