【问题标题】:Pass parameter to Angular ng-include将参数传递给 Angular ng-include
【发布时间】:2014-10-23 07:12:10
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

将参数传递给 Angular ng-include

你不需要那个。所有ng-include 的来源都具有相同的控制器。所以每个视图看到的数据都是一样的。

ng-init="item = item.left" 和 ng-repeat="item in item.left" 有什么区别

[1]

ng-init="item = item.left" 表示 - 创建新的实例名为 item 等于 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

这里的主要部分是您创建 Nodeid 包装 &lt;scipt&gt; 标记并使用 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>

【讨论】:

  • 感谢您的回答。这真的很有帮助。我会尝试写一个指令,类似于你的指令'node''nodeTree'
【解决方案2】:

这有点 hacky,但我将变量传递给一个 ng-include,其中包含一个包含 JSON 对象的数组的 ng-repeat:

<div ng-repeat="pass in [{'text':'hello'}]" ng-include="'includepage.html'"></div>

在您的包含页面中,您可以像这样访问您的变量:

<p>{{pass.text}}</p>

【讨论】:

  • 绝对是 hacky,但我完全在使用它!
  • #MEGA。从长远来看并不完美,但当我正在经历一个巨大的重构时,这会派上用场
  • 这是什么黑魔法?!这太简单了,我简直不敢相信我以前没有想过这个。我需要显示单个对象的多个联系人,并且联系人视图已被提取到模板 html,但是在没有硬编码的情况下传递每个联系人让我望而却步。谢谢!
  • @Jamadan,从你的观点来看,什么选择更适合长期? :)
  • @hellouworld - 哈哈,我什至不记得我在这里做什么项目。从那以后我就没有写过Angular了!我对更新从我的 API 返回的一些数据结构有模糊的记忆,因此我不需要这样做。抱歉,无法提供更多帮助。
【解决方案3】:

制作通用指令而不是 ng-include 是一种更简洁的解决方案: Angular passing scope to ng-include

【讨论】:

    【解决方案4】:

    我正在使用 ng-include 和包含字符串的数组的 ng-repeat。如果您想发送多个数据,请查看Junus Ergin 答案。

    查看我的代码片段:

    <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>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 2017-02-24
      相关资源
      最近更新 更多