![](/img/trans.png)
[英]AngularJS, ng-repeat with ng-include not rendering
[英]AngularJS recursive ng-repeat variable binding with ng-include
使用AngularJS编写动态结构时遇到问题。 我基本上有一个树形结构,它可以递归地递减到无穷大。 我需要根据这个树构建一个HTML页面,其中树的每个节点都需要根据其类型由特定的HTML模板显示。 通过使用ng-repeat
和ng-include
,除了出现与变量绑定相关的问题之外,我可以很容易地做到这一点。 为了更好地解释这种情况,我将使用一个简化的例子。 这是我的控制器:
function testController($scope,$http,$timeout,$window,$state, Data) {
$scope.blocks = []
block1 = {
"type":"block",
"id":1,
"innerblocks":[],
"html":"block1.html"
}
block21 = {
"type":"block",
"id":21,
"innerblocks":[],
"html":"block2.html"
}
block22 = {
"type":"block",
"id":22,
"innerblocks":[],
"html":"block2.html"
}
block1.innerblocks.push(block21);
block1.innerblocks.push(block22);
$scope.showFromBlock1 = function () {
$scope.blocks = [];
$scope.blocks.push(block1);
}
$scope.showFromBlock2 = function () {
$scope.blocks = [];
$scope.blocks.push(block21);
$scope.blocks.push(block22);
}
}
其中$scope.blocks
表示我的树的根,它有1个内部节点(block1)和2个叶子(block21和block22)。
index.html
是:
<!-- all the necessary tags and includes -->
<body ng-controller="testController">
<button ng-click="showFromBlock1()" >From Block1</button>
<button ng-click="showFromBlock2()" >From Block2</button>
<div ng-repeat="block in blocks">
<div ng-include="block.html">
</div>
</div>
</body>
而我的模板是: block1.html
<div>
<div>
BLOCK 1 TYPE: {{block.id}}
<div ng-repeat="innerblock in block.innerblocks">
<div ng-include="innerblock.html">
</div>
</div>
</div>
</div>
block2.html
<div>
<div>
BLOCK 2 TYPE: {{block.id}}
</div>
</div>`
如您所见,如果您运行此示例,当按下“From Block2”(意味着html应显示从第2级上的块开始的树)时,正确显示ID,因为index
的block
变量已正确绑定到block2.html
中的block2.html
。 如果按改为“从块1”,你会看到block
内变量block2.html
再次绑定的一个中index.html
,而不是被绑定到innerblock
变量block1.html
,从而显示“错误”的ID 。 我知道这是由于命名,但是如何管理这些递归情况,当有模板可以嵌套到另一个时,他们应该使用通用变量名? (当然,这是一个可能更复杂的事情的小例子)
而不是使用ng-include
创建一个带有隔离范围的指令,该指令将使用块中的模板。 这样,您就可以使用通用命名而不会发生任何冲突。
工作了一点我发现了我的解决方案。 在ng-repeat
中的每个ng-include
使用ng-init
就足以重新绑定循环变量。 据此, index.html
的重复将如下所示
<div ng-repeat="block in blocks">
<div ng-include="block.html" ng-init="block = block">
</div>
</div>
而block1.html
中的block1.html
将是
<div ng-repeat="innerblock in block.innerblocks">
<div ng-include="innerblock.html" ng-init="block = innerblock">
</div>
</div>`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.