要素のバイナリツリーを表示しようとしていますが、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を支配しているのは奇妙です。
Angular ng-includeにパラメーターを渡します
あなたはそれを必要としません。すべてのng-include
のソースには同じコントローラーがあります。したがって、各ビューには同じデータが表示されます。
Ng-init = "item = item.left"とng-repeat = "item.leftのアイテム"の違いは何ですか
[ 1 ]
ng-init="item = item.left"
は-item.left
と等しいitemという名前の新しいインスタンスを作成することを意味します。言い換えると、コントローラーに書き込むことで同じことを実現できます。
$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
ここで作成するメイン部分は、<scipt>
タグでラップされたid
を使用してNodeを作成し、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>
それは少しハックですが、JSONオブジェクトを含む配列のng-repeatで変数をng-includeに渡します:
<div ng-repeat="pass in [{'text':'hello'}]" ng-include="'includepage.html'"></div>
インクルードページで、次のように変数にアクセスできます。
<p>{{pass.text}}</p>
Ng-includeの代わりに汎用ディレクティブを作成すると、よりクリーンなソリューションになります。 ng-includeにスコープを渡す角度
文字列を含む配列のng-repeatとともにng-includeを使用しています。複数のデータを送信する場合は、 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>