我需要你的帮助来解决这个问题...我刚刚开始在地面上玩耍。
最初我只有一个按钮加载“添加列表”,添加列表用户可以添加多个列表,其中每个列表都有一个按钮(“添加阶段”),点击添加阶段它应该显示与该阶段相关的内容。
我是以动态的方式做这件事。
我的HTML看起来像:
<button ng-click="list()">add list</button>
<div id="container"></div>
我的控制器如下:
$scope.list =function(){
var name1html = '<div id="ide"><button ng-click="phase()">Add Phase</button><div id="drop"></div></div>';
var name1 = $compile(name1html)($scope);
angular.element(document.getElementById('container')).append(name1);
}
$scope.phase =function(){
var name2html = '<div>123</div>';
var name2 = $compile(name2html)($scope);
angular.element(document.getElementById('drop')).append(name2);
}
实际输出: On click of 2nd Add phase button it is again adding to 1st button
答案 0 :(得分:1)
我认为你没有考虑Angular的方式。您并不需要JS中的所有$compile
和HTML。让Angular做繁重的工作。在控制器中使用一系列列表,并使用ng-repeat在标记中迭代它。您可以为每个列表中的阶段嵌套内部ng-repeat。像这样:
<button ng-click="addList()">Add list</button>
<div>
<div ng-repeat="list in lists track by $index">
<div>
<button ng-click="addPhase($index)">Add Phase</button>
<ul>
<li ng-repeat="phase in list.phases track by $index">
{{ phase }}
</li>
</ul>
</div>
</div>
</div>
在你的控制器中:
$scope.lists = [];
$scope.addList = function() {
$scope.lists.push({ phases: [] });
};
$scope.addPhase = function($index) {
$scope.lists[$index].phases.push('123');
};
好的方法是,working Plunker
注意:我从标签中删除了ID,因为Angular不需要它们(它在内部跟踪它们)但如果你真的需要它们,你可以使用$index
来添加数值对于他们(对于@DmitriyLoskutov点,id属性应该是唯一的,而你试图添加具有相同id值的多个元素)。
编辑:
你可以在阶段中放置任何东西。像这样:
<button ng-click="addList()">Add list</button>
<div>
<div ng-repeat="list in lists track by $index">
<div>
<button ng-click="addPhase($index)">Add Phase</button>
<ul>
<li ng-repeat="phase in list.phases track by $index">
<div data-exp-page exp-page-attribute-one="{{$index}}" exp-page-attribute-two="{{phase.name}}"></div>
</li>
</ul>
</div>
</div>
</div>
这只是为了表明您可以在该阶段<li>
中包含任何HTML。如果需要在指令上传递属性,则可以这样做。唯一性由track by
值定义。在示例中,这可以是$index
,因为没有任何唯一值的现有模型,或者如果您具有唯一属性的现有模型(例如,数据库记录),您可以将$index
更改为list.uuid
或其他什么。
您还可以使用$parent.$index
从阶段中访问列表 - 如果要删除已添加的阶段,例如,您可以执行以下操作:
<li ng-repeat="phase in list.phases track by $index">
<div>
<input type="text" name="phase-name-{{$index}}" ng-model="phase.name">
<button type="button" ng-click="removePhase($parent.$index, $index)">Remove this phase</button>
</div>
</li>
然后在控制器中:
$scope.removePhase = function($listIndex, $phaseIndex) {
$scope.lists[$listIndex].phases.splice($phaseIndex, 1);
};
答案 1 :(得分:0)
$scope.list =function() {
// use class insead of id
var name1html = '<div class="ide"><button ng-click="phase($event)">Add Phase</button><div class="drop"></div></div>';
var name1 = $compile(name1html)($scope);
angular.element(document.getElementById('container')).append(name1);
};
$scope.phase = function ($event) {
var name2html = '<div>123</div>';
var name2 = $compile(name2html)($scope);
var drop = $event.target.parentNode.querySelector('.drop'); // we get the right div tag with class drop
angular.element(drop).append(name2);
};
答案 2 :(得分:0)
试
$scope.list =function(){
var name1html = '<div id="ide"><button ng-click="phase($event)">Add Phase</button><div id="drop"></div></div>';
var name1 = $compile(name1html)($scope);
angular.element(document.getElementById('container')).append(name1);
}
$scope.phase =function($event){
var name2html = '<div>123</div>';
var name2 = $compile(name2html)($scope);
angular.element($event.currentTarget).next().append(name2);
}
并删除id
,因为只要触发phase
答案 3 :(得分:0)
使用重复作为&#34;模板&#34; - 注意反映列表中项目的textarea:
http://jsfiddle.net/0088orkk/1/
&#34;用户创建的列表生成的对象&#34;输入的值可以很容易地发送,存储或操作。
<div ng-app ng-controller="MyCtrl">
<input type="button" value="addList" ng-click="addList()"/><br/><br/>
<ul>
<li ng-repeat="item in items"> <input type="button" value="addPhase" ng-click="addPhase(item)"/>
<div ng-repeat="phase in item.phases">
{{phase.value}}
<form>
<input type="text" ng-model="phase.Value1"/>
<input type="text" ng-model="phase.Value2"/>
<input type="text" ng-model="phase.Value3"/>
</form>
</div>
</li>
</ul><br/>
<br/>
<hr/>
<br/>
Items:<br/>
<textarea style="width:400px;height:400px">{{items}}</textarea>
</div>
function MyCtrl($scope) {
$scope.items =[];
$scope.addList = function(){
$scope.items.push({phases:[]});
};
$scope.addPhase = function(item){
item.phases.push({value:123});
};
}