2015-04-02 46 views
0

我需要扩展此工作示例以包含多个面板,每个面板都显示各自的数据集。将角度数据绑定到多个自举面板

我目前有两个独立的控制器,并将每个面板绑定到每个控制器,每个控制器都包含它们自己的单独数据集。但是,面板的数量需要是动态的,并基于数据馈送的内容进行构建。

显然,我并不是真的想要建立一个单独的控制器。创建单个数据模型然后将过滤结果集绑定到每个面板是更有意义的,例如, flittered和约束基础上,panel_id:

$scope.items = [ 
    { 
     title: 'Header - 1', 
     content: 'Panel 2-Dynamic Group Body - 1', 
     panel_id: '1' 
    }, 
    { 
     title: ' Header - 2', 
     content: 'Panel 2-Dynamic Group Body - 2', 
     panel_id: '2' 
    }, 
    { 
     title: ' Header - 3', 
     content: 'Panel 2-Dynamic Group Body - 3', 
     panel_id: '3' 
    } 
    ]; 

HTML代码:

<!doctype html> 
<html ng-app="ui.bootstrap.demo"> 
<head> 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.js"></script> 
    <script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.12.1.js"></script> 
    <script src="app.js"></script> 
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet"> 
    <link href="style.css" rel="stylesheet"/> 
</head> 
<body> 

<!-- Panel 1 --> 

<div ng-controller="showhideCtrl_1"> 
    <div class="panel panel-default"> 
    <!-- Default panel contents --> 
    <div class="panel-heading">Panel 1 heading</div> 
    <button class="btn btn-default " ng-show="hidevar" ng-click="hidevar=false">Back</button> 
    <!-- List group --> 
    <ul class="list-group" ng-hide="hidevar"> 
     <li class="list-group-item" ng-repeat="item in items" ng-click="showdes(item)"><a>{{item.title}}</a></li> 
    </ul> 
    <div class="panel-body" ng-show="hidevar"> 
     {{itemdesc.content}} 
    </div> 
    </div> 
</div> 

<!-- Panel 2 --> 

<div ng-controller="showhideCtrl_2"> 
    <div class="panel panel-default"> 
    <!-- Default panel contents --> 
    <div class="panel-heading">Panel 2 heading</div> 
    <button class="btn btn-default " ng-show="hidevar" ng-click="hidevar=false">Back</button> 
    <!-- List group --> 
    <ul class="list-group" ng-hide="hidevar"> 
     <li class="list-group-item" ng-repeat="item in items" ng-click="showdes(item)"><a>{{item.title}}</a></li> 
    </ul> 
    <div class="panel-body" ng-show="hidevar"> 
     {{itemdesc.content}} 
    </div> 
    </div> 
</div> 
</body> 
</html> 

这里的javascript代码

angular.module('ui.bootstrap.demo', ['ui.bootstrap']); 
angular.module('ui.bootstrap.demo').controller('showhideCtrl_1', function ($scope) { 

    $scope.items = [ 
    { 
     title: 'Header - 1', 
     content: 'Panel 1-Dynamic Group Body - 1' 
    }, 
    { 
     title: ' Header - 2', 
     content: 'Panel 1-Dynamic Group Body - 2' 
    }, 
    { 
     title: ' Header - 3', 
     content: 'Panel 1-Dynamic Group Body - 3' 
    } 
    ]; 

    $scope.showdes = function(item){ 

    $scope.itemdesc=item; 
    $scope.hidevar=true; 
    } 


}); 

angular.module('ui.bootstrap.demo').controller('showhideCtrl_2', function ($scope) { 

    $scope.items = [ 
    { 
     title: 'Header - 1', 
     content: 'Panel 2-Dynamic Group Body - 1' 
    }, 
    { 
     title: ' Header - 2', 
     content: 'Panel 2-Dynamic Group Body - 2' 
    }, 
    { 
     title: ' Header - 3', 
     content: 'Panel 2-Dynamic Group Body - 3' 
    } 
    ]; 

    $scope.showdes = function(item){ 

    $scope.itemdesc=item; 
    $scope.hidevar=true; 
    } 


}); 

这里是我到目前为止工作的例子:

http://plnkr.co/edit/l65Q3MiofrNn5DyCgCfM?p=preview

回答

3

制定一个指令,它将成为一个面板并通过该指令的项目。属于面板上的每个HTML会去它的模板:

angular.module('ui.bootstrap.demo').directive('showHide', function() { 
    return { 
    restrict: 'E', 
    scope: { 
     items : '=', 
     index: '=' 
    }, 
    template: '<div class="panel panel-default">\ 
     <!-- Default panel contents -->\ 
     <div class="panel-heading">Panel {{index}} heading</div><button class="btn btn-default " ng-show="hidevar" ng-click= "hidevar=false">Back</button>\ 
     <!-- List group -->\ 
     <ul class="list-group" ng-hide="hidevar" >\ 
      <li class="list-group-item" ng-repeat="item in items" ng-click="showdes(item)"><a>{{item.title}}</a> </li>\ 
     </ul>\ 
     <div class="panel-body" ng-show="hidevar">\ 
      {{itemdesc.content}}\ 
     </div>\ 
     </div>', 
    link: function(scope, elm, attr) { 
     scope.showdes = function(item){  
      scope.itemdesc=item; 
      scope.hidevar=true; 
     } 
    } 
    }; 
}); 

然后你就可以拥有的项目清单列表中选择控制器:

angular.module('ui.bootstrap.demo').controller('main', function ($scope) { 

$scope.itemsList = [[ 
    { 
     title: 'Header - 1', 
     content: 'Panel 1-Dynamic Group Body - 1' 
    }, 
    { 
     title: ' Header - 2', 
     content: 'Panel 1-Dynamic Group Body - 2' 
    }, 
    { 
     title: ' Header - 3', 
     content: 'Panel 1-Dynamic Group Body - 3' 
    } 
    ],[ 
    { 
     title: 'Header - 1', 
     content: 'Panel 2-Dynamic Group Body - 1' 
    }, 
    { 
     title: ' Header - 2', 
     content: 'Panel 2-Dynamic Group Body - 2' 
    }, 
    { 
     title: ' Header - 3', 
     content: 'Panel 2-Dynamic Group Body - 3' 
    } 
    ]]; 


}); 

而在你的HTML把ngRepeat动态创建每个列表的指令可用:

<div ng-repeat="list in itemsList"> 
    <show-hide items="list" index="$index + 1"></show-hide> 
</div> 

看到这个plunker

+0

非常完美,非常感谢您的支持。奇迹般有效。 – user1513388 2015-04-02 08:54:24

+0

嗨我需要更新我的数据模型,以便它包含我的面板标题的名称,因为这些数据将被动态生成。我在这里创建了一个新的Plunker,它显示:http://plnkr.co/edit/XbX0hF8gFzolTdKF3qxp?p=preview。但是,我现在还无法弄清楚如何将它绑定到面板上。 – user1513388 2015-04-02 17:31:23

+0

您只需要将ng重复更改为在itemsList.store中列出。检查此http://plnkr.co/edit/jPMzuEPe3rHHwJmowWZM?p=preview – eladcon 2015-04-02 17:38:42