将参数传递给Angular ng-include

时间:2014-08-29 09:30:45

标签: javascript angularjs angularjs-ng-repeat angularjs-ng-include angularjs-ng-init

我正在尝试显示元素的二叉树,我使用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。

4 个答案:

答案 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。

请参阅我的代码片段:

&#13;
&#13;
<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;
&#13;
&#13;