我正在尝试学习AngularJs,并且不确定创建通过数据绑定填充的选项卡式窗格的正确方法。
具体来说,我有三个HTML表,它们从3个不同的JSON文件中提取数据。显示此代码的代码很好用:
JS:
var myApp = angular.module("myApp",[]);
myApp.factory("Purchases", function(){
var Purchases = {};
Purchases.data = [
{
date: "20/05/2012",
text: "Lorem ipsum dolor sit amet ipsum dolor"
},
{
date: "20/05/2012",
text: "Lorem ipsum dolor sit amet ipsum dolor"
}
];
return Purchases;
});
function PurchasesCtrl($scope, Purchases){
$scope.purchases = Purchases;
}
myApp.factory("SaleProducts", function(){
var SaleProducts = {};
SaleProducts.data = [
{
date: "20/05/2012",
text: "Lorem ipsum dolor sit amet ipsum dolor"
},
{
date: "20/05/2012",
text: "Lorem ipsum dolor sit amet ipsum dolor"
}
];
return SaleProducts;
});
function SaleProductsCtrl($scope, SaleProducts){
$scope.saleProducts = SaleProducts;
}
myApp.factory("Sale30Days", function(){
var Sale30Days = {};
Sale30Days.data = [
{
date: "20/05/2012",
text: "Lorem ipsum dolor sit amet ipsum dolor"
},
{
date: "20/05/2012",
text: "Lorem ipsum dolor sit amet ipsum dolor"
}
];
return Sale30Days;
});
function Sale30DaysCtrl($scope, Sale30Days){
$scope.sale30Days = Sale30Days;
}
HTML:
<div ng-app="myApp">
<div class="tabs">
<a href="" title="" class="tab selected" rel="tab1">Tab 1</a>
<a href="" title="" class="tab" rel="tab2">Tab 2</a>
<a href="" title="" class="tab" rel="tab3">Tab 3</a>
</div>
<div id="tab1" class="tabContent selected" ng-controller="PurchasesCtrl">
<h2>Tab content 1:</h2>
<table cellspacing="0">
<tr class="first">
<th class="first">Date</th>
<th>Description</th>
</tr>
<tr ng-repeat="purchase in purchases.data" ng-class-odd="'odd'" ng-class-even="'even'" ng-class="{'last':$last}">
<td class="first">{{purchase.date}}</td>
<td>{{purchase.text}}</td>
</tr>
</table>
</div>
<div id="tab2" class="tabContent selected" ng-controller="SaleProductsCtrl">
<h2>Tab content 2:</h2>
<table cellspacing="0">
<tr class="first">
<th class="first">Date</th>
<th>Description</th>
</tr>
<tr ng-repeat="saleProduct in saleProducts.data" ng-class-odd="'odd'" ng-class-even="'even'" ng-class="{'last':$last}">
<td class="first">{{saleProduct.date}}</td>
<td>{{saleProduct.text}}</td>
</tr>
</table>
</div>
<div id="tab3" class="tabContent selected" ng-controller="Sale30DaysCtrl">
<h2>Tab content 3:</h2>
<table cellspacing="0">
<tr class="first">
<th class="first">Date</th>
<th>Description</th>
</tr>
<tr ng-repeat="sale30Day in sale30Days.data" ng-class-odd="'odd'" ng-class-even="'even'" ng-class="{'last':$last}">
<td class="first">{{sale30Day.date}}</td>
<td>{{sale30Day.text}}</td>
</tr>
</table>
</div>
</div>
这里有一个小提琴:http://jsfiddle.net/9hZx5/2/。
现在,我不确定的部分是如何在页面加载时隐藏第二个和第三个选项卡,然后使用顶部的链接在选项卡式内容窗格之间切换。使用jQuery执行此操作(a)不起作用,(b)似乎非常错误,因为我想以'Angular'方式执行此操作。
我已经尝试按照这个小提琴http://jsfiddle.net/vojtajina/vM4FY/向链接和面板添加'ng:click'和'ng:show',但我无法让它工作。我在此发现的教程/示例(例如Angular Bootstrap选项卡指令http://angular-ui.github.io/bootstrap/)似乎都通过转发器动态生成选项卡,这在我的场景中增加了很多复杂性。
我想知道是否有人能指出我正确的方向?
非常感谢大家。
答案 0 :(得分:1)
实际上,'ng-click'和'ng-show'指令确实有效 - 它是一些额外的CSS,它覆盖了显示器并使选项卡选择看起来不起作用。解决方案是将上面的选项卡选择器链接更改为:
<a href="" title="" class="tab active" rel="tab1" ng:click="selected=1">Purchases</a>
<a href="" title="" class="tab" rel="tab2" ng:click="selected=2">Products on sale</a>
<a href="" title="" class="tab" rel="tab3" ng:click="selected=3">Last 30 days sales</a>
标签窗格为:
<div id="tab1" class="tabContent" ng-controller="PurchasesCtrl" ng:show="selected == 1">
Tab content
</div>
<div id="tab2" class="tabContent" ng-controller="SaleProductsCtrl" ng:show="selected == 2">
Tab content
</div>
<div id="tab3" class="tabContent" ng-controller="Sale30DaysCtrl" ng:show="selected == 3">
Tab content
</div>
body {
font: 12px arial, helvetica, sans-serif;
}
h2 {
font-size: 16px;
}
table {
margin: 20px 0;
border-collapse:collapse;
}
th,td {
border: 1px solid #ccc;
padding: 2px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.min.js"></script>
<script>
var myApp = angular.module("myApp",[]);
myApp.factory("Purchases", function(){
var Purchases = {};
Purchases.data = [
{
date: "20/05/2012",
text: "Lorem ipsum dolor sit amet ipsum dolor",
price: "£123.45",
availability: "Available until 10th Dec 2013"
},
{
date: "20/05/2012",
text: "Lorem ipsum dolor sit amet ipsum dolor",
price: "£123.45",
availability: "Available until 10th Dec 2013"
},
{
date: "20/05/2012",
text: "Lorem ipsum dolor sit amet ipsum dolor",
price: "£123.45",
availability: "Available until 10th Dec 2013"
}
];
return Purchases;
});
function PurchasesCtrl($scope, Purchases){
$scope.purchases = Purchases;
}
myApp.factory("SaleProducts", function(){
var SaleProducts = {};
SaleProducts.data = [
{
date: "20/05/2012",
text: "Lorem ipsum dolor sit amet ipsum dolor",
price: "£123.45",
availability: "Available until 10th Dec 2013"
},
{
date: "20/05/2012",
text: "Lorem ipsum dolor sit amet ipsum dolor",
price: "£123.45",
availability: "Available until 10th Dec 2013"
}
];
return SaleProducts;
});
function SaleProductsCtrl($scope, SaleProducts){
$scope.saleProducts = SaleProducts;
}
myApp.factory("Sale30Days", function(){
var Sale30Days = {};
Sale30Days.data = [
{
date: "20/05/2012",
text: "Lorem ipsum dolor sit amet ipsum dolor",
price: "£123.45",
availability: "Available until 10th Dec 2013"
},
{
date: "20/05/2012",
text: "Lorem ipsum dolor sit amet ipsum dolor",
price: "£123.45",
availability: "Available until 10th Dec 2013"
},
{
date: "20/05/2012",
text: "Lorem ipsum dolor sit amet ipsum dolor",
price: "£123.45",
availability: "Available until 10th Dec 2013"
},
{
date: "20/05/2012",
text: "Lorem ipsum dolor sit amet ipsum dolor",
price: "£123.45",
availability: "Available until 10th Dec 2013"
}
];
return Sale30Days;
});
function Sale30DaysCtrl($scope, Sale30Days){
$scope.sale30Days = Sale30Days;
}
</script>
<div ng-app="myApp">
<div class="tabs">
<a href="" title="" class="tab active" rel="tab1" ng:click="selected=1">Purchases</a>
<a href="" title="" class="tab" rel="tab2" ng:click="selected=2">Products on sale</a>
<a href="" title="" class="tab" rel="tab3" ng:click="selected=3">Last 30 days sales</a>
</div>
<div id="tab1" class="tabContent" ng-controller="PurchasesCtrl" ng:show="selected == 1">
<h2>Purchases:</h2>
<table cellspacing="0">
<tr class="first">
<th class="first">Date</th>
<th>Description</th>
<th>Amount</th>
<th>Status</th>
</tr>
<tr ng-repeat="purchase in purchases.data" ng-class-odd="'odd'" ng-class-even="'even'" ng-class="{'last':$last}">
<td class="first">{{purchase.date}}</td>
<td>{{purchase.text}}</td>
<td>{{purchase.price}}</td>
<td>{{purchase.availability}}</td>
</tr>
</table>
</div>
<div id="tab2" class="tabContent" ng-controller="SaleProductsCtrl" ng:show="selected == 2">
<h2>Sale products:</h2>
<table cellspacing="0">
<tr class="first">
<th class="first">Date</th>
<th>Description</th>
<th>Amount</th>
<th>Status</th>
</tr>
<tr ng-repeat="saleProduct in saleProducts.data" ng-class-odd="'odd'" ng-class-even="'even'" ng-class="{'last':$last}">
<td class="first">{{saleProduct.date}}</td>
<td>{{saleProduct.text}}</td>
<td>{{saleProduct.price}}</td>
<td>{{saleProduct.availability}}</td>
</tr>
</table>
</div>
<div id="tab3" class="tabContent" ng-controller="Sale30DaysCtrl" ng:show="selected == 3">
<h2>Sale 30 days:</h2>
<table cellspacing="0">
<tr class="first">
<th class="first">Date</th>
<th>Description</th>
<th>Amount</th>
<th>Status</th>
</tr>
<tr ng-repeat="sale30Day in sale30Days.data" ng-class-odd="'odd'" ng-class-even="'even'" ng-class="{'last':$last}">
<td class="first">{{sale30Day.date}}</td>
<td>{{sale30Day.text}}</td>
<td>{{sale30Day.price}}</td>
<td>{{sale30Day.availability}}</td>
</tr>
</table>
</div>
</div>