javascript - 在 Angular 应用程序中使用复选框输入填充嵌套数组

标签 javascript arrays angularjs

在我的 Angular 应用程序中,我有以下复选框列表,它们是在嵌套的 ng-repeat 中生成的:

<div ng-repeat="type in boundaryPartners">
    <div class="row" ng-show="showBPtype[$index]">
        <div class="col-xs-12">
            <div ng-repeat="partner in type.partners">
                <label class="checkbox-inline">
                    <input type="checkbox"
                        value="partner.id"
                        ng-model="partner.selected"
                        ng-change="changeValue(partner)"
                        />
                    <p><span ></span>{{partner.name}}<p>
                </label>
            </div>
        </div>
    </div>
</div>

此列表是从数据中检索的,具有以下结构(示例):

{
    "id": 1,
    "name": "Civil Society Organizations",
    "partners": [{
        "id": 1,
        "name": "Youth Association"
    }, {
        "id": 2,
        "name": "Rwanda Network"
    }, {
        "id": 3,
        "name": "Communité du Rwanda"
    }]
},

{
    "id": 2,
    "name": "Educational Organizations",
    "partners": [{
        "id": 16,
        "name": "SchoolA"
    }, {
        "id": 17,
        "name": "SchoolB"
    }]
}

这是一个对象数组,代表合作伙伴的类型,每个对象都包含数组partners中当时的合作伙伴列表。

最终看起来如下图所示:

enter image description here

当用户使用 chekcbox 选择合作伙伴时,该合作伙伴应该添加到选定合作伙伴的嵌套列表中(遵循类似的结构),并且当用户取消选择复选框时,该合作伙伴将被添加到所选合作伙伴的嵌套列表中(遵循类似的结构)。合作伙伴将被删除。

我已经有一个working solution对于由用户 Artyom Pranovich in his answer 提供的合作伙伴的单一列表(这一切都归功于他)。

这是他的代码:

var partnersList = [], idsArray = [];

$scope.changeValue = function(partner){
   if(partner.selected)
      addPartner(partner);
   else
      removePartner(partner);
};

var addPartner= function(partner){
    if(!existInList(partner))
       partnersList.push(partner);
};

var removePartner= function(partner){
    idsArray = getIdsArray();
    var indexToRemove = idsArray.indexOf(partner.id);
    if(indexToRemove == -1)
       return;

    partnersList.splice(indexToRemove, 1);
};

var existInList = function(partner){
    idsArray = getIdsArray();
    return idsArray.indexOf(partner.id) != -1;
};

var getIdsArray = function(){
    return partnersList.map(function(partner){ return partner.id });
};

但是,使用我上面描述的界面,我需要填充合作伙伴的嵌套列表,其中仅包含用户选择的合作伙伴,具有相同的结构如我之前描述的那样:按类型组织的合作伙伴对象列表(具有 type.id 数字和 type.partners 数组)。

我尝试了一些解决方案,使用 $parent.$index$index 来查找必要时应该添加/删除的合作伙伴,但我不能我似乎对此很感兴趣。

使建议的代码适应我的需求的最佳方法是什么?

编辑:根据要求添加包含所选合作伙伴的最终列表的结构(即合作伙伴必须推送到的列表)。示例:

[
    {
        "id": 1,
        "entities": [
            {
                "id": 2,
                "name": "Entity 2"
            },
            {
                "id": 3,
                "name": "Entity 3"
            }
        ]
    },
    {
        "id": 2,
        "entities": [
            {
                "id": 2,
                "name": "Entity 2"
            }
        ]
    }
]

在应用程序中,此列表称为 $scope.report.participatingPartners

最佳答案

如果我理解你的问题,解决方案将与it类似。 .

如果您有疑问,请随时提问。

<div ng-repeat="organization in boundaryPartners">
    <div ng-repeat="partner in organization.partners">
        <label>
            <input type="checkbox" value="partner.id" ng-model="partner.selected" 
                   ng-change="changeValue(partner, organization, $parent.$index)"/>
            {{partner.name}}
        </label>
    </div>
    <hr/>
</div>
<小时/>
$scope.participatingPartners = []
var idsArray = [];

$scope.changeValue = function(partner, organization, index){
   if(partner.selected)
      addPartner(partner, organization, index);
   else
      removePartner(partner, organization, index);
};

var addPartner= function(partner, organization, index){
    prepareArrayToAdd(organization, index);
    if(!existInList(index, partner)){
        $scope.participatingPartners[index].partners.push(partner);
    }
};

var prepareArrayToAdd = function(organization, index){
    if(!$scope.participatingPartners[index])
        $scope.participatingPartners[index] = { id: organization.id, name: organization.name, partners: [] };
};

var removePartner= function(partner, organization, index){
    idsArray = getIdsArray(index);
    var indexToRemove = idsArray.indexOf(partner.id);
    if(indexToRemove == -1)
       return;

    $scope.participatingPartners[index].partners.splice(indexToRemove, 1);
};

var existInList = function(index, partner){
    idsArray = getIdsArray(index);
    return idsArray.indexOf(partner.id) != -1;
};

var getIdsArray = function(index){
    return $scope.participatingPartners[index].partners.map(function(partner){ return partner.id });
};

JSFIddle链接。

希望对你有帮助!

关于javascript - 在 Angular 应用程序中使用复选框输入填充嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32843590/

相关文章:

javascript - 如何使用 node-fetch 模块模拟 curl 请求

c - C中如何确定数组元素的个数?

javascript - 为什么我在 Jasmine 1.3.x 中的 AngularJS 异步测试不起作用?

javascript - Linkedin Api 如何通过人员搜索获取群组详细信息

javascript - 更改 Materialise + Meteor 中的默认主要颜色和次要颜色

javascript - 使用 JavaScript 遍历数组查找数字的倍数

javascript - diff 2 数组,其中的项目只是重新排序

javascript - 服务属性更改时, Angular 过滤器不会更新

javascript - 如何将指令参数传递给指令

javascript - 检测浏览器或 CEF/Electron