我正在尝试显示元素的二叉树,我使用ng-include递归地进行。
ng-init="item = item.left"
和ng-repeat="item in item.left"
之间有什么区别?
在这个例子中,它的行为完全相同,但我在项目中使用类似的代码,并且它的行为有所不同。我想这是因为Angular范围。
也许我不应该使用ng-if,请解释我如何做得更好。
pane.html是:
<div ng-if="!isArray(item.left)">
<div ng-repeat="item in [item.left]" ng-include="'Views/pane.html'">
</div>
</div>
<div ng-if="isArray(item.left)">
{{item.left[0]}}
</div>
<div ng-if="!isArray(item.right)">
<div ng-repeat="item in [item.right]" ng-include="'Views/pane.html'">
</div>
</div>
<div ng-if="isArray(item.right)">
{{item.right[0]}}
</div>
<div ng-if="!isArray(item.left)">
<div ng-init = "item = item.left" ng-include="'Views/pane.html'">
</div>
</div>
<div ng-if="isArray(item.left)">
{{item.left[0]}}
</div>
<div ng-if="!isArray(item.right)">
<div ng-init="item = item.right" ng-include="'Views/pane.html'">
</div>
</div>
<div ng-if="isArray(item.right)">
{{item.right[0]}}
</div>
控制器是:
var app = angular.module('mycontrollers', []);
app.controller('MainCtrl', function ($scope) {
$scope.tree = {
left: {
left: ["leftleft"],
right: {
left: ["leftrightleft"],
right: ["leftrightright"]
}
},
right: {
left: ["rightleft"],
right: ["rightright"]
}
};
$scope.isArray = function (item) {
return Array.isArray(item);
}
});
编辑: 首先,我遇到的问题是指令ng-repeat的优先级高于ng-if。我试图将它们组合起来,但失败了。 IMO奇怪的是ng-repeat支配ng-if。
答案 0 :(得分:46)
将参数传递给Angular ng-include
你不需要那个。所有ng-include
的来源都有相同的控制器。因此每个视图都会看到相同的数据。
ng-init =&#34; item = item.left&#34;有什么区别?和ng-repeat =&#34; item.left&#34;
中的项目
[1]
ng-init="item = item.left"
表示 - 创建等于item.left
的新实例命名项。换句话说,通过在控制器中写入来实现相同的目的:
$scope.item = $scope.item.left
[2]
ng-repeat="item in item.left"
表示根据item.left
数组创建范围列表。您应该知道ng-repeat
中的每个项目都有其私有范围
我正在尝试显示元素的二叉树,我使用ng-include递归地进行。
我在过去的帖子中回答了如何使用ng-include
显示树。
它可能会有所帮助: how-do-display-a-collapsible-tree
此处的主要部分是您使用id
标记包裹<scipt>
来创建节点并使用ng-repeat
:
<script type="text/ng-template" id="tree_item_renderer">
<ul class="some" ng-show="data.show">
<li ng-repeat="data in data.nodes" class="parent_li" ng-include="'tree_item_renderer'" tree-node></li>
</ul>
</script>
<ul>
<li ng-repeat="data in displayTree" ng-include="'tree_item_renderer'"></li>
答案 1 :(得分:42)
这有点hacky,但我将变量传递给ng-include,其中包含一个包含JSON对象的数组的ng-repeat:
<div ng-repeat="pass in [{'text':'hello'}]" ng-include="'includepage.html'"></div>
在您的包含页面中,您可以像这样访问您的变量:
<p>{{pass.text}}</p>
答案 2 :(得分:5)
制作通用指令而不是ng-include是一个更清晰的解决方案: Angular passing scope to ng-include
答案 3 :(得分:2)
我正在使用ng-include和包含字符串的数组的ng-repeat。如果您想发送多个数据,请参阅Junus Ergin answer。
请参阅我的代码片段:
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="">
<div ng-repeat="name in ['Sanjib Pradhan']" ng-include="'your_template.html'"></div>
<div ng-repeat="name in ['Chinmay Sahu']" ng-include="'your_template.html'"></div>
<script type="text/ng-template" id="your_template.html">
{{name}}
</script>
</div>
&#13;