单个ng-repeat中的多个无线电组不起作用

时间:2018-03-18 14:15:05

标签: javascript angularjs angularjs-ng-repeat radio-group angular-formly

我无法想出这个,不知道为什么它不起作用。我有一个情况,我需要有父复选框,当选择这些复选框时,子单选按钮下拉,他们需要为他们选择的每个复选框选择一个项目。这部分工作正常,问题是当选择了多个复选框时,单选按钮的行为就像它们都在同一个名称下,即使它们不是......当选择一个时,所有其他按钮在我只选中时取消选择希望取消选择该名称下的其他人。编写模板是为了形式使用,这就是为什么你看到ng-model看起来很奇怪,它基本上是用于形式化的模型(一个优秀的动态js形式库为angularjs)

以下是送入ng-repeats的数组:

to.parents = [{name: 'IR', value: 'IR'}, {name: 'IS', value: 'IS'}, {name: 'IP', value: 'IP'}];

to.children = [{name: 'New', value: 'IRNew', parent: 'IR'}, {name: 'Maintenance', value: 'IRMain', parent: 'IR'}, {name: 'Existing', value: 'IRExist', parent: 'IR'}, {name: 'New', value: 'ISNew', parent: 'IS'}, {name: 'Maintenance', value: 'ISMain', parent: 'IS'}, {name: 'Existing', value: 'ISExist', parent: 'IS'}, {name: 'New', value: 'IPNew', parent: 'IP'}, {name: 'Maintenance', value: 'IPMain', parent: 'IP'}, {name: 'Existing', value: 'IPExist', parent: 'IP'}]

以下是以下模板:

<div class="radio-group row" ng-class="{\'has-error\': options.formControl.$invalid}">
    <label class="control-label">{{to.label}}{{to.required ? \'*\' : \'\'}}</label>
</div>
<div class="row" style="margin-left:10px;">
    <div class="{{to.col}}" ng-repeat="parent in to.parents track by $index" style="margin-top: 5px; margin-left:0px;" 
     ng-class="{\'checkbox\': !to.inline, \'checkbox-inline\':to.inline}">
        <input type="checkbox" id="{{parent.value}}{{$index}}" 
         class="checkbox-inline styled styled-primary multiCheck{{$index}}" 
         aria-describedby="{{id}}_description" ng-value="parent.name" 
         ng-model="$parent.model[$parent.options.key || $parent.$index][parent.value]"
         ng-disabled="{{parent.disabled}}">
         <label for="{{parent.value}}{{$index}}" style="font-weight: normal;">{{parent.name}}</label>
         <p id="{{id}}_description" class="help-block" ng-if="parent.desc">{{parent.desc}}</p>
         <div class="radio" style="margin-left:20px; margin-top: 10px;" 
         ng-repeat="child in to.children track by $index"
         ng-class="{\'radio\': !to.radInline, \'radioinline\':to.radInline}" 
         ng-if="child.parent === parent.name && $parent.model[$parent.options.key|| $parent.$index][parent.value]">
            <div class="radio-group {{to.colChild}} pull-left"    
             style="margin-top: 5px; margin-bottom: 10px;">
               <input type="radio" name="{{child.parent}}" id="{{child.value}}{{parent.value}}{{$index}}" 
                class="radio radio{{$index}}" ng-value="child.value" ng-model="model[parents.key]">
               <label for="{{child.value}}{{parent.value}}{{$index}}">{{child.name}}</label>
            </div>
          </div>
     </div>
</div>

所以基本上无线电组名称与父母姓名相同,因此IP中的孩子有IP作为他们的名字,IR下的孩子有IR作为他们的名字,IS下的孩子有IS作为他们的名字......但是它们仍然表现得像是同名的一部分 - 它对我没有意义,因为单选按钮应该按照名字分组......任何帮助都会非常感激!

PS:请不要告诉我使用内联样式---我知道它不是最好的做法,但是我别无选择,因为我工作的公司有全球css表,这是唯一可以看到的at,所以对此的任何修改都需要内联完成。

1 个答案:

答案 0 :(得分:1)

https://plnkr.co/edit/Id1HxsRvYECQYOe3oMKD?p=preview

任何人都很难理解这个标记。它需要更复杂,而且很难阅读。尽可能在控制器中进行所有结构化以使视图变干,使其简单易读。

将孩子映射到原始父阵列或创建一个新阵列:

  parents = parents.map(function(p) {
    p.children = children.filter(function(c) {
      return c.parent == p.name;
    });
    return p;
  });

现在你的新父阵列看起来像这样:

  /*
  parents = [
    {
      name: 'IR', 
      value: 'IR',
      children: [
        {name: 'New', value: 'IRNew', parent: 'IR'}, 
        {name: 'Maintenance', value: 'IRMain', parent: 'IR'}, 
        {name: 'Existing', value: 'IRExist', parent: 'IR'}, 
      ]
    }, 
    {
      name: 'IS', 
      value: 'IS',
      children: [
        {name: 'New', value: 'ISNew', parent: 'IS'}, 
        {name: 'Maintenance', value: 'ISMain', parent: 'IS'}, 
        {name: 'Existing', value: 'ISExist', parent: 'IS'}
      ]
    }, 
    {
      name: 'IP', 
      value: 'IP'
      children: [
        {name: 'New', value: 'IPNew', parent: 'IP'}, 
        {name: 'Maintenance', value: 'IPMain', parent: 'IP'}, 
        {name: 'Existing', value: 'IPExist', parent: 'IP'}
      ]
    }
  ]; */

每个复选框都有自己的子项,可以轻松映射到标记中。我已经将它简化为功能所需的简单内容:

<form>
  <div ng-repeat="p in parents track by $index">
    <label for="">{{p.name}}</label>
    <input type="checkbox" name="" id="" value="" ng-model="p.isChecked" />
    <div ng-repeat="c in p.children track by $index" ng-show="p.isChecked">
      <label for="">{{c.name}}</label>
      <input type="radio" name="" id="" ng-value="c.value" ng-model="p.radioChoice"/>
    </div>
  </div>
</form>

注意模型值的isCheckedradioChoice。一旦定义了模型的值,Angular就会将这些添加到父对象。

这已经按原样运行,我们甚至没有命名无线电。请注意,无线电的ng-model属于父母。我们真正需要的是孩子们应该代表的价值。