当前位置: 首页 > 知识库问答 >
问题:

在AngularJS中动态显示ng重复指令中的模板?

太叔睿
2023-03-14

我正在尝试根据当前项目动态显示ng-重复指令中的几个模板之一。

我的JSON数据如下所示:

data: {
    groups: [
        {
            name: "Group 1",                
            sections: [
                { name: "Section A" },
                { name: "Section B" }
            ]
        },
        {
            name: "Group 2",                
            sections: [
                { name: "Section A" },
                { name: "Section B" }
            ]
        }
    ]
}

我的目标是动态呈现数据树,每组包含多个部分。这些组都将具有相同的模板,但每个部分都应基于名称字段具有自己的模板。

假设顶层HTML为:

<div ng-repeat="group in groups">
    {{ group.name }}
    <div ng-repeat="section in sections">
        <!-- Dynamic section template used -->
    </div>
</div>

理想情况下,每个部分还需要有自己的作用域数据和与之关联的控制器。我很幸运地使用Knockout构建了这种类型的系统,但我正在尝试理解Angular的做事方式。

共有2个答案

倪子晋
2023-03-14

在过去的一个月里,angular在一个指令中支持动态模板,但我找不到关于其使用的很多信息。这是参考资料。https://github.com/angular/angular.js/pull/1849

尽管这仍然使用相同的nginclude,但它都封装在两个指令中:

演示:http://plnkr.co/edit/4DIlHMNlHQ8Wm9XHNycH?p=preview

超文本标记语言:

<groups-control groupdata="groups"></groups-control>

控制器:

app.controller('MainCtrl', function($scope) {
  $scope.name = 'World';
  var json = {data: {
    groups: [
        {
            name: "Group 1",                
            sections: [
                { name: "Section A" },
                { name: "Section B" }
            ]
        },
        {
            name: "Group 2",                
            sections: [
                { name: "Section A" },
                { name: "Section B" }
            ]
        }
    ]
  }};
  $scope.groups = json.data.groups;

}); 

指令一分为二:

app.directive('groupsControl', function(){
    return {
      restrict: 'E',

      replace: true,
      transclude: false,
      scope: { items:'=groupdata'},

      template: '<div ng-repeat="group in items">' +
                  '{{ group.name }}' +
                  '<section-control sections="group.sections" />'+

              '</div>',
      // The linking function will add behavior to the template
      link: function(scope, element, attrs) {


      }
    }
  }).directive('sectionControl', function(){
    return {
      restrict: 'E',

      replace: true,
      transclude: false,
      scope: { items:'=sections'},

      template: '<div ng-repeat="section in items" ng-include="getIncludeFile(section)">'+
                '</div>',

      link: function(scope, element, attrs) {
        scope.getIncludeFile = function(section) {
            return section.name.toLowerCase().replace('section ','') + ".html";
        }

      }
    }
  });

我实际上希望看到有人根据一些范围数据使用templateUrl的函数发布答案。

越伯寅
2023-03-14

您可以这样做:

<div ng-repeat="group in groups">
    {{ group.name }}
    <div ng-repeat="section in sections" ng-include="getIncludeFile(section)">
        <!-- Dynamic section template used -->
    </div>
</div>

然后在控制器中:

$scope.getIncludeFile = function(section) {
    // Make this more dynamic, but you get the idea
    switch (section) {
        case "Section A":
            return 'partials/sectiona.html';
        case "Section B":
            return 'partials/sectionb.html';
    }
}

然后您的sectiona.html可能如下所示(具有特定于该文件的控制器):

<div ng-controller="SectionAController">
    <!-- HTML in here, and can bind straight to your SectionAController -->
</div>
 类似资料:
  • 问题内容: 我正在尝试根据当前项目动态显示ng-repeat指令中的多个模板之一。 我的JSON数据如下所示: 我的目标是动态渲染数据树,每个组包含多个部分。这些组都将具有相同的模板,但是每个部分都应基于名称字段具有自己的模板。 假设顶层HTML是: 理想情况下,每个部分还需要具有自己的范围数据和与其关联的控制器。我很幸运用Knockout构建了这种类型的系统,但是我想了解Angular的做事方式

  • 我是新的angularjs。我想动态添加指令到基于标题的div从控制器...下面是我尝试的... 以下是我使用的指令和工厂 下面是我如何使用ng repeat 这不管用

  • 问题内容: 我正在尝试根据范围值使用不同的模板进行指令。 这是我到目前为止所做的,我不知道为什么它不起作用http://jsbin.com/mibeyotu/1/edit HTML元素: 指示: 问题答案: 1)您正在将内容作为属性传递到html中。试试这个: 代替: 2)指令的数据部分正在被编译,因此您应该使用其他东西。代替数据类型,例如datan-type。 链接在这里: http://jsb

  • 问题内容: 我花了一段时间试图找到一个优雅的解决方案,而我却找到了一个“可行”的解决方案,它感觉不是最简单或正确的做事方式。 所以,我的问题是…如何动态加载指令!在某些情况下,以下是我希望我能摆脱它的方式!除了模板加载之外,我没有包含路由或其他任何内容,而是为下面的控制器分配了ng- controller。 app.js template.html 任何人都可以提供的建议将不胜感激,如果我做任何明

  • 问题内容: 这是我的AngularJs指令。它原本希望在模板中显示div,但是在运行代码时却什么也没有显示。 这是HTML 这是AngularJS指令 这是演示 问题答案: 声明指令时,您使用了名称,但这是错误的。您应该使用,因为它将被转换为元素。 指令名称中的任何大写字母都将转换为连字符,因为元素中未使用大写字母。例如将翻译为。 正如其他人提到的,AngularJS使用以下标准化规则进行标准化:

  • 在我的角度页面中,我面临着动态ng模型值的一些问题。这是我的示例JSON。 我想从这个josn中做的是,在我的页面中创建一个视图,这样,它将包含< code>tab1和< code>tab2作为页面标题,以及相应的< code>value作为< code>checkbox。用户将有选择他的选项的选择性。在提交时,我想得到他选择的选项。我想知道在我的控制器中选择了< code>value1,valu