@Tim库尔特,我创建的东西以下@Stewie的想法。
它绝对可以改善,但我想这是一个很好的起点。
我创建了一个小的指令手风琴的面板的单击事件绑定。点击事件时,我通过panel-template=
属性传递面板模板,并更新在面板内部使用的main-template
。
它使参考对包含各面板的内容2个的HTML文件(panel1.html和panel2.html)。 我建议创建一个服务来通过AJAX获取这些文件 - 就像你想要的那样。 在下面的代码中,我为此创建了一个名为dataService
的服务,并且您应该将其绑定到click
事件 - 因此当用户单击它时,会按需加载文件。
注意的mainTemplate是一种常见的面板全部手风琴,所以当它改变了所有的手风琴将具有相同的内容,但我假设你想在时间显示只有一个面板,对吧?!
反正我之前说的逻辑可以提高解决这些小“陷阱”,但我相信的核心功能是在那里开始。 :)
<!doctype html>
<html ng-app="myApp">
<head>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js"></script>
<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet">
<script>
var myApp = angular.module('myApp', []);
myApp.controller('AccordionDemoCtrl', ['$scope', 'dataService', function ($scope, dataService) {
$scope.oneAtATime = true;
$scope.mainTemplate = '';
$scope.groups = [
{
id: "001",
title: "Dynamic Group Header - 1",
content: "Dynamic Group Body - 1",
template: "panel1.html"
},
{
id: "002",
title: "Dynamic Group Header - 2",
content: "Dynamic Group Body - 2",
template: "panel2.html"
}
];
}]);
myApp.factory('dataService', [ '$http', function($http){
return {
getData: function() {
return // you AJAX content data here;
}
}
}]);
myApp.directive('accordionToggle', [function() {
return {
restrict: 'C',
scope: {
mainTemplate: '=',
panelTemplate: '@'
},
link: function (scope, element, iAttrs) {
element.bind('click', function(e){
scope.mainTemplate = scope.panelTemplate;
scope.$apply();
});
}
};
}]);
</script>
</head>
<body ng-controller="AccordionDemoCtrl">
<div class="accordion" id="accordionParent">
<div class="accordion-group" ng-repeat="group in groups" >
<div class="accordion-heading">
<a class="accordion-toggle" main-template="$parent.mainTemplate" panel-template="{{ group.template }}" data-toggle="collapse" data-parent="#accordionParent" href="#collapse{{ $parent.group.id }}">
Collapsible Group Item {{ $parent.group.id }}
</a>
</div>
<div id="collapse{{ group.id }}" class="accordion-body collapse">
<div class="accordion-inner">
<div class="include-example" ng-include="mainTemplate"></div>
</div>
</div>
</div>
</div>
</body>
</html>
只需在面板内部使用'
',并在打开面板时定义/设置'panelTemplate' var。这将仅在面板第一次打开时执行XHR请求并获取面板视图。 – Stewie谢谢Stewie。这看起来很有前途,但我不清楚如何在面板打开时触发panelTemplate的define/set。如果您想用代码示例发布答案,我会尝试它并(可能)接受它。谢谢。 –