Dynamically displaying template in ng-repeat directive in AngularJS?
我正在尝试根据当前项动态显示ng repeat指令中的几个模板之一。
我的JSON数据如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | data: { groups: [ { name:"Group 1", sections: [ { name:"Section A" }, { name:"Section B" } ] }, { name:"Group 2", sections: [ { name:"Section A" }, { name:"Section B" } ] } ] } |
我的目标是动态地呈现数据树,每个组包含多个部分。这些组都有相同的模板,但是每个部分都应该有自己的模板,基于名称字段。
假设顶级HTML是:
1 2 3 | {{ group.name }} <!-- Dynamic section template used --> |
理想情况下,每个部分还需要有自己的范围数据和与之关联的控制器。我很幸运用淘汰的方式建立了这种类型的系统,但我正在努力理解做事情的角度方式。
你可以这样做:
1 2 3 | {{ group.name }} <!-- Dynamic section template used --> |
然后在控制器中:
1 2 3 4 5 6 7 8 9 | $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可以如下所示(要有一个特定于该文件的控制器):
1 | <!-- HTML in here, and can bind straight to your SectionAController --> |
在过去的一个月里,为了支持一个指令中的动态模板,有一个签入到Angular,但是我找不到关于它的使用的很多信息。这是参考资料。https://github.com/angular/angular.js/pull/1849
尽管它仍然使用相同的nginclude,但都封装在两个指令中:
演示:http://plnkr.co/edit/4dilhmnlhq8wm9xhnych?P=预览
HTML:
1 | <groups-control groupdata="groups"></groups-control> |
控制器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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; }); |
指令分为两部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | app.directive('groupsControl', function(){ return { restrict: 'E', replace: true, transclude: false, scope: { items:'=groupdata'}, template: '' + '{{ group.name }}' + '<section-control sections="group.sections" />'+ '', // 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: ''+ '', link: function(scope, element, attrs) { scope.getIncludeFile = function(section) { return section.name.toLowerCase().replace('section ','') +".html"; } } } }); |
实际上,我希望看到有人使用基于某些范围数据的templateURL函数发布一个答案。