javascript - 如何制作一个 selectAll 复选框并触发 ng-click 每个复选框的每个功能?

标签 javascript angularjs checkbox underscore.js lodash

我有一些代码,当您单击复选框时,它将执行 ng-click。这是它的 JS。

$scope.selectTitle = function(evt, selected){
        evt.stopPropagation();
        var filtered = _.findWhere($scope.selectedTitles, {id: selected.id});
        var index = _.indexOf($scope.selectedTitles, selected);
        if(selected === filtered){
            $scope.selectedTitles.splice(index, 1)
        }
        else{
            $scope.selectedTitles.push(selected);
        }
        console.log('titles', $scope.selectedTitles, 'filtered', filtered, 'index', index);
     };

它位于一个带有 ng-repeat 和 ng-click 代码的表中,因此我使用 .stopPropagation() 来防止激活表的 ng-click 功能。

现在我需要制作一个全选复选框。这是我的代码。

$scope.selectAll = function (filteredTitles) {
        if ($scope.selectedAll) {
            $scope.selectedAll = false;
        } else {
            $scope.selectedAll = true;
        }
        _.forEach(filteredTitles, function(cpPortfolioItem) {
            cpPortfolioItem.Selected = $scope.selectedAll;
            if(cpPortfolioItem.Selected){
                $scope.selectTitle();
            }
     });

当我运行它时。出现错误:TypeError:无法读取未定义的属性“stopPropagation”

我无法删除 stopPropagation,因为它阻止了我之前所说的事情。您能给我一些关于如何选择所有复选框并调用每个复选框的 ng-click 函数的建议吗?提前致谢。

最佳答案

一些想法。

为什么要使用 selectedAll 添加到范围?应该只是 Controller 内的私有(private)变量。

var selectedAll = false;
$scope.selectAll = function(){
      selectedAll = !selectedAll; // quick toggle.
      _.forEach(filteredTitles, function(title){
                    title.isSelected = selectedAll;
       }
}

然后你的复选框应该直接挂接到 title.isSelected 状态。单独或使用 selectAll 更改它会相当容易。

参见:https://docs.angularjs.org/api/ng/directive/ngChecked

<input ng-checked="title.isSelected" .../>

其中“title”实际上是您的 ng-repeat 数据对象。

此外,我建议在 ng-repeat 中使用指令。

示例指令:

angular.module('appName')
    .directive('portfolioItem', function() {
        return{
            restrict:'E',  // Element only style
            replace:true,
            templateUrl:'portfolioItem.view.html',
            scope:{
                data:'='  // binds the attribute into your scope
            }
            // You can add a controller here as well. 
        };
    });

然后为“portfolioItem.view.html”创建一个脚本ng-template

<script ng-template="portfolioItem.view.html">
    <section class="item">
     {{data}}  
     <input ng-checked="data.isSelected" ... />
    </section>
</script>

https://docs.angularjs.org/api/ng/directive/script

如果我能帮到你一点点就好了。我认为你的选择项目功能应该改变。将您的数据推送到工厂,然后工厂就可以成为所有 Controller 的支柱。这就是我们所做的,减少您的观察者并提高您处理数据的能力。

 angular.module('appName')
        .factory('DataManager', DataManager);

    function DataManager($log, $timeout, ItemModel) {
        var mngr, config = getConfig();  // any default values

        $log.debug('DataManager Init');

        mngr = {
            CurrentSearchTerm: null,
            Items: [],
            Abort: abort,
            GetData: getData,  // Function call to get data.
            GetMoreResults: getMoreResults
        };

        function getData(){
            dataService.getData().then(function(response){
             //  ...parse data, etc...loop and :
             mngr.Items.push(parsedDataItem);
            };
        }


        return mngr;
   }

然后您的 Controller 将重复 DataManager.Items(或将其过滤为下划线或 Angular )。有道理吗?

关于javascript - 如何制作一个 selectAll 复选框并触发 ng-click 每个复选框的每个功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30250948/

相关文章:

javascript - 将两个表单元素与 JS 和非 JS 备份结合起来

Javascript拼接方法困惑

javascript - 防止固定位置对象在特定位置随页面滚动

javascript - Javascript 中的多行(HTML 和 JSP)

angularjs - 在我的 angularjs Controller 中获取 ng-change 字段的值

javascript - 使用 AngularJS 指令从 select 中删除重复项

angularjs - 为什么 Internet Explorer 中收不到 POST 响应数据?

asp.net - asp.net 复选框的 CSS 选择器

asp.net - 在 asp.net 中从 gridview 获取选中的行

javascript - 用于复选框选择的 jQuery for 循环