Ajax 如何使用AngularJS在可折叠面板中延迟加载内容

Ajax 如何使用AngularJS在可折叠面板中延迟加载内容,ajax,twitter-bootstrap,angularjs,lazy-loading,Ajax,Twitter Bootstrap,Angularjs,Lazy Loading,我正在构建一个应用程序,它使用组件渲染一系列面板,所有面板最初都将处于折叠状态 由于页面可能包含许多这样的面板,并且每个面板都可能包含大量内容,因此在用户展开任何面板时执行AJAX调用,根据需要填充这些面板似乎是合适的 页面的动态内容(包括面板的标记)是使用AngularJS呈现的,我假设可以将AngularJS配置为绑定到面板元素上的事件,这会导致在它们展开时延迟加载它们的内容 不幸的是,在看过AngularJS文档和可用的教程之后,我看不出如何最好地解决这个问题。有人能解释一下吗 提前感谢,

我正在构建一个应用程序,它使用组件渲染一系列面板,所有面板最初都将处于折叠状态

由于页面可能包含许多这样的面板,并且每个面板都可能包含大量内容,因此在用户展开任何面板时执行AJAX调用,根据需要填充这些面板似乎是合适的

页面的动态内容(包括面板的标记)是使用AngularJS呈现的,我假设可以将AngularJS配置为绑定到面板元素上的事件,这会导致在它们展开时延迟加载它们的内容

不幸的是,在看过AngularJS文档和可用的教程之后,我看不出如何最好地解决这个问题。有人能解释一下吗

提前感谢,


蒂姆

@Tim Coulter,我根据@Stewie的想法创造了一些东西

当然可以改进,但我想这是一个很好的起点

我创建了一个小指令来绑定手风琴面板的点击事件。触发单击事件时,我通过
panel template=
属性传递了面板模板,它更新了面板内部使用的
主模板

它引用了包含每个面板内容的两个html文件(panel1.html和panel2.html)。 我建议创建一个服务,通过AJAX获取这些文件——这正是您想要的方式。 在下面的代码中,我为此创建了一个名为
dataService
的服务,您应该将其绑定到
click
事件,以便在用户单击时根据需要加载文件

请注意,主模板是所有手风琴的通用面板,因此当它更改时,所有手风琴将具有相同的内容,但我假设您希望一次只显示一个面板,对吗

不管怎样,正如我之前所说,可以改进逻辑来修复这些小问题,但我相信核心功能是从这里开始的。:)


var myApp=angular.module('myApp',[]);
myApp.controller('AccordionDemoCtrl',['$scope','dataService',function($scope,dataService){
$scope.oneAtATime=true;
$scope.main模板=“”;
$scope.groups=[
{
id:“001”,
标题:“动态组标题-1”,
内容:“动态组体-1”,
模板:“panel1.html”
},
{
id:“002”,
标题:“动态组标题-2”,
内容:“动态群组主体-2”,
模板:“panel2.html”
}
];
}]);
工厂('dataService',['$http',函数($http){
返回{
getData:function(){
return//在此处输入AJAX内容数据;
}
}
}]);
myApp.directive('accordionToggle',[函数(){
返回{
限制:“C”,
范围:{
mainTemplate:“=”,
panelTemplate:“@”
},
链接:功能(范围、要素、iAttrs){
元素绑定('click',函数(e){
scope.mainTemplate=scope.panelTemplate;
作用域:$apply();
});
}
};
}]);

@Tim Coulter,我根据@Stewie的想法创造了一些东西

当然可以改进,但我想这是一个很好的起点

我创建了一个小指令来绑定手风琴面板的点击事件。触发单击事件时,我通过
panel template=
属性传递了面板模板,它更新了面板内部使用的
主模板

它引用了包含每个面板内容的两个html文件(panel1.html和panel2.html)。 我建议创建一个服务,通过AJAX获取这些文件——这正是您想要的方式。 在下面的代码中,我为此创建了一个名为
dataService
的服务,您应该将其绑定到
click
事件,以便在用户单击时根据需要加载文件

请注意,主模板是所有手风琴的通用面板,因此当它更改时,所有手风琴将具有相同的内容,但我假设您希望一次只显示一个面板,对吗

不管怎样,正如我之前所说,可以改进逻辑来修复这些小问题,但我相信核心功能是从这里开始的。:)


var myApp=angular.module('myApp',[]);
myApp.controller('AccordionDemoCtrl',['$scope','dataService',function($scope,dataService){
$scope.oneAtATime=true;
$scope.main模板=“”;
$scope.groups=[
{
id:“001”,
标题:“动态组标题-1”,
内容:“动态组体-1”,
模板:“panel1.html”
},
{
id:“002”,
标题:“动态组标题-2”,
内容:“动态群组主体-2”,
模板:“panel2.html”
}
];
}]);
工厂('dataService',['$http',函数($http){
返回{
getData:function(){
return//在此处输入AJAX内容数据;
}
}
}]);
myApp.directive('accordionToggle',[函数(){
返回{
限制:“C”,
范围:{
mainTemplate:“=”,
panelTemplate:“@”
},
链接:功能(范围、要素、iAttrs){
元素绑定('click',函数(e){
scope.mainTemplate=scope.panelTemplate;
作用域:$apply();
});
}
};
}]);
这是
<!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>
<accordion>
  <accordion-group 
    heading=""
    ng-repeat="foo in bar"
    ng-init="status = {load: false}"
    ng-click="status.load = true">

  <myDirective ng-if="status.load"></myDirective>
  </accordion-group>
</accordion>