AngularJS - 创建自定义数据绑定和ng-repeat

时间:2012-08-13 14:59:44

标签: javascript jquery angularjs

我正在尝试创建一个自定义控制器,它显示绑定到如下数据集的一堆类似对象:

[{name: card1, values: {opt1: 9, opt2: 10}},{name: card1, values: {opt1: 9, opt2: 10}}]

我想显示每张卡的名称和值之一(在屏幕上表示为每个卡的正方形),只显示一个值,具体取决于用户是否单击选项1的按钮或选项2.我坚持使用ng-repeat时如何更改显示的值。

html代码:

<div ng-controller="aggViewport" >
<div class="btn-group">
    <button class="btn active">opt1</button>
    <button class="btn">opt2</button>
</div>
<div id="container" iso-grid width="500px" height="500px">
    <div ng-repeat="card in cards" class="item {{card.class}}">
        <table width="100%">
            <tr>
                <td align="center">
                    <h4>{{card.name}}</h4>
                </td>
            </tr>
            <tr>
                <td align="center"><h2>{{card.opt1}}</h2></td>
            </tr>
        </table>        
    </div>
</div>

控制器:

module.controller('aggViewport',['$scope','$location',function($scope,$location){
$scope.cards = [{name: card1, values: {opt1: 9, opt2: 10}},{name: card1, values: {opt1: 9, opt2: 10}}];


}]);

1 个答案:

答案 0 :(得分:4)

以下是您问题的可能解决方案

<div ng-controller="aggViewport" >
<div class="btn-group" >
    <button ng-click="setOption(opt.name)" ng-repeat="opt in optList" class="btn active">{{opt.name}}</button>
</div>
<div id="container" iso-grid width="500px" height="500px">
    <div ng-repeat="card in cards" class="item {{card.class}}" ng-controller="aggCardController">
        <table width="100%">
            <tr>
                <td align="center">
                    <h4>{{card.name}}</h4>
                </td>
            </tr>
            <tr>
                <td align="center"><h2>{{getOption()}}</h2></td>
            </tr>
        </table>        
    </div>
</div>

在你的控制器中:

module.controller('aggViewport',['$scope','$location',function($scope,$location){
$scope.cards = [{name: card1, values: {opt1: 9, opt2: 10}},{name: card1, values: {opt1: 9, opt2: 10}}];

$scope.option = "opt1";

$scope.setOption = function(val){
$scope.option = val;
}

}]);

module.controller('aggCardController',['$scope',function($scope){

$scope.getOption = function(){
return $scope.card.values[$scope.option];
}

}]);

只是为了解释这里发生的事情。 aggCardController是单独定义的,因为在使用ng-repeat时会创建一个新的范围。此外,当您引入带有ng-repeat的控制器时,您将创建控制器来控制该范围。所以现在您可以单独访问每个范围。并且将为每个创建的范围创建一个新的控制器。因为在html中,aggCardController来自aggViewPort,它将从父作用域继承属性。因此,如果您在aggViewPort中声明选项,它将被继承到所有子范围。

这里引入这个新控制器的原因是因为这句话

return $scope.card.values[$scope.option];

因为我们在这里尝试访问$ scope.card并且记住该卡是在转发器中创建的新变量。此新变量仅在转发器创建的子范围中可用。如果您不需要访问$ scope.card,那么我们可以在父作用域中编写此getOption()函数。

另请注意,javascript中的所有对象都是assciative数组。这就是我们使用数组访问运算符[]访问opt1或opt2中的值的原因。

希望这有帮助。