0

我有这个 JSFiddle 代码:

http://jsfiddle.net/rnnb32rm/285/

<div ng-app="angularjs-starter" ng-controller="MainCtrl">
   <fieldset  data-ng-repeat="choice in choicesA">
      <input type="text" ng-model="choice.name" name="" placeholder="Enter name">
         <button class="addfields" ng-click="addNewChoice()">Add fields</button>
      <button class="remove" ng-click="removeChoice()">-</button>
   </fieldset>


   <div id="choicesDisplay">
      {{ choicesA }} <br/>
      {{ choicesB }}
   </div>
</div>

JS:

var app = angular.module('angularjs-starter', []);

  app.controller('MainCtrl', function($scope) {

  $scope.choicesA = [{id: 'choice1'}, {id: 'choice2'}];

  $scope.choicesB = [];

  $scope.addNewChoice = function() {
    var newItemNo = $scope.choicesA.length+1;
    $scope.choicesA.push({'id':'choice'+newItemNo});
  };

  $scope.removeChoice = function() {
    var lastItem = $scope.choicesA.length-1;
    $scope.choicesA.splice(lastItem);
  };

});

如您所见,我有一个addNewChoice()将对象添加到数组的函数choicesA,然后根据choicesA数组上的对象编号添加文本框。

fieldset只有当我单击第一个上的Add fields按钮时,我才需要将文本框添加到第一个fieldset,并且我在这些生成的文本框中写入的数据被绑定并添加到choicesB数组中的单独对象中。对于所有其他Add fields按钮也是如此(因此每个Add field按钮只能将文本框添加到自己的fieldset标签中),这也是根据choicesA数组中对象的数量生成的。

我什么都试过了,就是想不通。如果有点不清楚,我可以解释更多。提前谢谢你。

编辑:谢谢大家的大力帮助,让我解释一下:

我有一个 Spring REST API 和两个Java名为 Resource & Action 的对象(JPA 实体),对象 Resource 包含一个 Action 列表,Action 包含对 Resource 的引用。

Resource当我加载一个页面时,我得到一个我已经保存的对象数组,通过一个 $http.get() 方法从数据库返回,命名为choicesA,数组的结构是这样的:

[
{"idResource":1, "nameResource": "resName1"},
{"idResource":2, "nameResource": "resName2"}
......etc depends oh how much rows I got from the DB
]

我有另一种方法 $http.post() ,它发布一个Action名为choicesB单独非嵌套数组的对象数组。数组结构是这样的:

[
{"idAction":1, "nameAction":"nameAction1", "resource": 
   {"idResource":1, "nameResource": "resName1"},
{"idAction":2, "nameAction":"nameAction2", "resource": 
   {"idResource":2, "nameResource": "resName2"},
   ..
}
{...},
{...}
...
]

所以choicesA数组包含了Resource我用 $http.get() 得到的对象,然后我想Action在数组中填充对象,choicesB然后使用 $http.post() 保存数组,每个都Action应该包含一个Resource对象。例如,如果我单击以在第一个fieldset标记中添加更多操作,则意味着我要填充数组中的第一个Action对象,并将位于数组中choicesB的第一个对象分配给它等等。ResourcechoicesA

我希望能够决定动作的数量并填写它们,然后将它们保存到choicesB数组中。Resource但是每个动作都与我描述的特定对象相关。

我希望现在很清楚,对不起,再次感谢您。

4

3 回答 3

1

也许我误解了你的问题。也许这将有助于解决您的问题。

jsfiddle上的实时示例。

var app = angular.module('angularjs-starter', []);

app.controller('MainCtrl', function($scope) {

  $scope.choicesA = [{
    id: 'choice1',
    choicesB:[]
  }, {
    id: 'choice2',
    choicesB:[]
  }];


  $scope.addNewChoice = function() {
    var newItemNo = $scope.choicesA.length + 1;
    $scope.choicesA.push({
      'id': 'choice' + newItemNo,
      choicesB:[]
    });
  };

  $scope.removeChoice = function(ind) {
    $scope.choicesA.splice(ind,1);
  };

  $scope.addNewChoiceB = function(choice) {
    var newItemNo = choice.choicesB.length + 1;
    choice.choicesB.push({
      'id': 'choice' + newItemNo
    });
  };

  $scope.removeChoiceB = function(choice,ind) {
    choice.choicesB.splice(ind,1);
  };

});
fieldset {
  background: #FCFCFC;
  padding: 16px;
  border: 1px solid #D5D5D5;
}

.addfields {
  margin: 10px 0;
}

#choicesDisplay {
  padding: 10px;
  background: rgb(227, 250, 227);
  border: 1px solid rgb(171, 239, 171);
  color: rgb(9, 56, 9);
}

.remove {
  background: #C76868;
  color: #FFF;
  font-weight: bold;
  font-size: 21px;
  border: 0;
  cursor: pointer;
  display: inline-block;
  padding: 4px 9px;
  vertical-align: top;
  line-height: 100%;
}

input[type="text"],
select {
  padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="angularjs-starter" ng-controller="MainCtrl">
  <button class="addfields" ng-click="addNewChoice()">Add choice</button>
  <fieldset data-ng-repeat="choice in choicesA">
    <input type="text" ng-model="choice.name" name="" placeholder="Enter name">
    <button class="remove" ng-click="removeChoice($index)">-</button>
    <button class="addfields" ng-click="addNewChoiceB(choice)">Add fields</button>
    <div data-ng-repeat="choiceb in choice.choicesB">
      <input type="text" ng-model="choiceb.name" name="" placeholder="Enter field">
      <button class="remove" ng-click="removeChoiceB(choice,$index)">-</button>
    </div>
  </fieldset>


  <div id="choicesDisplay">
    <pre>choicesA = {{ choicesA }}</pre>
    <pre data-ng-repeat="choiceb in choicesA">choicesB = {{ choiceb.choicesB }}</pre>
  </div>
</div>

更新

jsfiddle上的实时示例。

于 2016-02-29T04:23:23.457 回答
1

我相信您要做的是拥有 2 个嵌套数组。

然后你会嵌套ng-repeat. 您通过将该数组作为函数的参数传递来跟踪哪个数组

看法

 <fieldset data-ng-repeat="group in choices">
    <div ng-repeat="choice in group">
      <input type="text" ng-model="choice.name" name="" placeholder="Enter name">
      <button class="addfields" ng-click="addNewChoice(group)">Add fields</button>
      <button class="remove" ng-click="removeChoice(group)">-</button>
    </div>
 </fieldset>

JS

$scope.choices = [
  // first group
  [{id: 'choice1'}, { id: 'choice2'}],
  //second group
  [{}]
];


$scope.addNewChoice = function(group) {
  var newItemNo = group.length + 1;
  group.push({
    'id': 'choice' + newItemNo
  });
};

$scope.removeChoice = function(group) {
  group.pop();
}; 

请注意,您将需要ID稍微修改您的系统。通常这无论如何都会来自服务器

DEMO

于 2016-02-29T04:17:10.117 回答
1
<div ng-app="angularjs-starter" ng-controller="MainCtrl">
<fieldset>
<input  data-ng-repeat="choice in choicesA" type="text" ng-model="choice.name" name="" placeholder="Enter name">
<button class="addfields" ng-click="addNewChoice()">Add fields</button>
<button class="remove" ng-click="removeChoice()">-</button>
</fieldset>     

您的要求的第一部分通过将文本框添加到特定字段集来解决,而我不清楚第二个要求用这个替换您的 htmlcode

于 2016-02-29T04:24:55.973 回答