【问题标题】:Using Angular to repeat over nested object使用 Angular 重复嵌套对象
【发布时间】:2015-07-21 07:05:01
【问题描述】:

我查看了有关此主题的先前问题,但找不到任何类似的内容。

我的问题是我想制作第二个 HTML 单选按钮数组,这取决于首先选择了 which 单选按钮。假设对象数组是这样来找我的:

"Names":[{ 
          "name": "Fido",
          "id": "1",
          "type": [
                {   
                "typeName": "Dog",
                "typeId": "1"
            },
            {
                "typeName": "Cat",
                "typeId": "2"
            },
            {
                "typeName": "Mouse",
                "typeId": "3"
            }
        ]
    },
    {
        "name": "Bella",
        "id": "2",
        "type": [
            {
                "typeName": "Cat",
                "typeId": "2"
            },
            {
                "typeName": "Mouse",
                "typeId": "3"
            }
        ]
    }]

我的 AngularJS 代码目前如下所示:

  <label ng-repeat="item in nameList.Names">
            <input type="radio" name="Name" ng-model="$parent.selectedName"
            ng-value="item"> {{item.name}} </input>

         <label ng-repeat="item in nameList.Names[$parent.selectedName.id].type"> <input
            type="radio" name="Type" ng-model="$parent.selectedType"
            ng-value="type"> {{item.typeName}}</input>
         </label>
  </label>

我很确定这不起作用,因为 $parent.selectedName.id 部分 - ng-repeat 已经创建了一个子范围,所以这将是原始范围的“孙子”,这意味着 $parent 是只是指上面的脚本,而不是其余的代码。

有没有办法解决这个问题,以便我可以有一个根据第一个选定值更改选项的列表?

编辑:我真正想做的是我希望能够选择一个单选按钮(在本例中为“Fido”或“Bella”),并根据选择在一个“类型”数组中弹出一个第二个单选按钮列表。有没有办法使这项工作或者我需要拆分“名称”对象?

【问题讨论】:

  • 如果你可以为它创建一个小提琴会很棒。以便我们了解您所期望的 HTML :)
  • jsfiddle.net/Lf9dpd3k - 不能再做任何事情了,因为我真的不知道代码应该是什么样子。我希望在选择前两个单选按钮后立即显示第二个单选按钮,而第二个单选按钮应该以内部“类型”数组中的元素命名。
  • 看答案。我想这就是您正在寻找的答案:)

标签: javascript html angularjs


【解决方案1】:

您应该在 ng-repeat 之外显示可选选项,并将所选项目设置为其他范围值。看这个sn-p。

注意:由于某种原因,单选按钮 ng-model 不能设置在范围变量上,但需要是对象的属性。不知道为什么。

angular
    .module('someApp', [])
    .controller('someController', function($scope){
  $scope.name = {
    selected: null
  };
  $scope.nameList = {
    Names: [{
     name: 'Foo',
     type: [
       { typeName: 'ready' },
       { typeName: 'steady' }
     ]
    },{
     name: 'Bar',
     type: [
       { typeName: 'start' },
       { typeName: 'stop' }
     ]
   }]
    };
  });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="someApp">
  <div ng-controller="someController">
    <div ng-repeat="item in nameList.Names">
      <label>
        <input type="radio" name="Name" ng-model="name.selected"
        ng-value="item" />{{item.name}}
      </label>
    </div>

    <label ng-repeat="type in name.selected.type">   
      <input
        type="radio" name="Type" ng-model="$parent.selectedType"
        ng-value="type"  />{{type.typeName}}
      </label>
  </div>
</div>

【讨论】:

  • 他们都指的是同一个范围,这是我的主要问题 - 两个收音机列表都需要扩大最高范围。
  • @Alex 我明白了,我创建了一个小提琴,它具有我认为你想要的功能。
  • 这看起来很正确 - 让我在实际代码上尝试一下,看看它是否有效!谢谢!
  • 您是否知道我如何将 $parent.selectedName 和 $parent.selectedType 绑定到您的代码@Justus?我正在处理一小部分,不使用它们会破坏其余代码。
  • @Alex 很难说没有任何上下文。但是例如,当您对选择进行选择时,您可以使用所选值更新原始数组。也许 $watch 或 ng-click 函数可以解决问题。
【解决方案2】:

请看下面的plnkr。我想这就是你要找的东西:

` `http://plnkr.co/edit/RQQi5Fo9FzM409qKHwjG?p=preview

我希望这能解决问题:)

【讨论】:

  • 很好的指导。我将它与最终代码中的答案一起使用。
【解决方案3】:

您可以使用ng-value 来满足您的需求:

<div ng-repeat="name in names">
      <input type="radio" name="myRadio" ng-model = "selectedParent" ng-value="name.type">
          {{name.name}}
      </input>
</div>
   <div ng-repeat="selected in selectedParent">
        <input type="radio" name="childRadio" ng-model="selectedId" ng-value="selected.typeId" >{{selected.typeName}}</input>
    </div>    

【讨论】:

  • 这看起来可行 - 请您创建一个 plunkr 或 fiddle 以便我看看这在实践中是如何工作的?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 2020-10-08
相关资源
最近更新 更多