使用Angular迭代表

时间:2016-02-24 19:30:15

标签: javascript jquery angularjs

我是角度和js的新手。我做了一张桌子(只是一个标题)和一个按钮。当我单击按钮时,会添加一个新的行。该行的每个单元格都是表单文本字段。 Everithing工作正常。现在我正在尝试做第二个按钮,当我点击它时必须迭代行并验证字段。我没有找到任何关于那个的文档...所以我不确定这个mettod(用按钮添加一个新行)是否合适。这就是我做到的:

index.html这包含angular和我的脚本,还包含路由:

<html ng-app="assets">
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
        <script src="sources/js/angular.min.js"></script>
        <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.10/angular-route.min.js"></script>
        <script>
            var assets = angular.module('assets', ['ngRoute']);

            assets.config(function($routeProvider) {
                $routeProvider.
                when('/', {
                    templateUrl: 'home.html'
                }).
                when('/:tipusactius', {
                    templateUrl: 'tipusactius.html',
                    controller: 'TipusActiusCtrl'
                }).
                when('/:tipusactius/alta', {
                    templateUrl: 'tipusactius-alta.html',
                    controller: 'AfegirTipusActiusCtrl'
                }).
                otherwise({
                    redirectTo: '/'
                });
            });


            assets.controller('TipusActiusCtrl', function ($scope, $http){
                $http.get('http://10.0.203.73/WS/ws.php/tipusactius/').success(function(data) {
                    $scope.tipus_actius = data;
                });

                // Ordena taula per id desc
                $scope.sortField = 'idtipus_actius';
                $scope.reverse = false;
            });

            assets.controller('AfegirTipusActiusCtrl', function ($scope, $http){

                    // Camps formulari text pla
                    $scope.nomAtribut = "<input type='text' name='firstname'>";
                    $scope.mida = "<input type='number' name='firstname'>";
                    $scope.obligatori = "<input type='checkbox' name='vehicle' value='yes'>";

                    // Construeix combo
                    $http.get('http://10.0.203.73/WS/ws.php/getCombo/1').success(function(data) {
                        $scope.options = data;
                    });

                    $scope.atributs = [];
                    $scope.addField = function() {
                        $scope.atributs.push($scope.atributs.length);
                    };

                    $scope.prioritat = $scope.atributs.length;
            });

            assets.directive('compile', compile);

            function compile($compile)
            {
                return {
                    restrict: 'A',
                    replace: true,
                    link: linkFunction
                };

                function linkFunction(scope, element, attrs)
                {
                    scope.$watch(
                        function (scope)
                        {
                            return scope.$eval(attrs.compile);
                        },
                        function (value)
                        {
                            element.html(value);

                            $compile(element.contents())(scope);
                        }
                    );
                }
            }

            </script>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" 
        integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
    </head>
    <body>
        <div class="container" ng-view></div>
    </body>
</html>

这是表格(tipusactius-alta)的视图:

    
    <div class="row">
        <div class="col-md-8" ng-controller="AfegirTipusActiusCtrl">
            <button ng-click="addField()">Nou atribut</button>
            <div>
                <table class="table">
                    <tr>
                        <td>Nom atribut</td>
                        <td>Tipus</td>
                        <td>Mida</td>
                        <td>Prioritat</td>
                        <td>Obligatori</td>
                    </tr>
                    <tr ng-repeat="atribut in atributs">
                        <td compile="nomAtribut"></td>
                        <td>
                            <select id="tipus">
                                <option ng-repeat="option in options" value="{{option.idvalors_combo}}">{{option.valor}}</option>
                            </select>
                        </td>
                        <td compile="mida"></td>
                        <td>
                            <select id="prioritat">
                                <option ng-repeat="p in prioritat" value="{{p}}">{{p}}</option>
                            </select>
                        </td>
                        <td compile="obligatori"></td>
                    </tr>
                </table>
            </div>
        </div>
    </div>
</div>

我不确定这是不是一个好主意。我想找到一种迭代行来读取单元格值的方法,如果所有行中的所有单元格的值都正常,则将值提交给Web服务但我不知道。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

您实际上并不需要直接操作html。只需对数据集合使用ng-repeat。 Button应该向该集合添加新项目,angular将在文档中创建新的表格行。

我在这里创建了一些小样本:http://jsfiddle.net/Lvc0u55v/252/

var myApp = angular.module('myApp', []);

myApp.controller('tableCtrl', function($scope) {

  $scope.dataTable = [{
    "name": "Alex",
    "lastName": "Karlov",
    "age": 23,
    "sex": 1
  }];


  $scope.options = [{
    "value": 1,
    "title": "Male"
  }, {
    "value": 2,
    "title": "Female"
  }];


  $scope.addRow = function() {
    var newItem = {
      name: "",
      lastName: "",
      age: "",
      sex: ""
    }
    $scope.dataTable.push(newItem);
  };

});

这是html(我是根据你的代码创建的):

<div class="col-md-8" ng-controller="tableCtrl">
  <button ng-click="addRow()">Add row</button>
  <div>
    <table class="table">
      <tr>
        <td>#</td>
        <td>Name</td>
        <td>Last Name</td>
        <td>Age</td>
        <td>Sex</td>
      </tr>
      <tr ng-repeat="item in dataTable">
        <td>{{ $index + 1 }}</td>
        <td>
          <input type="text" ng-model="item.name" />
        </td>
        <td>
          <input type="text" ng-model="item.lastName" />
        </td>
        <td>
          <input type="text" ng-model="item.age" />
        </td>
        <td>
        <select ng-options="option.value as option.title for option in options" ng-model="item.sex"></select>
        </td>
      </tr>
    </table>
  </div>
</div>

在该示例中,我将所有数据都放入dataTable变量中。当我想再添加一行时,我只需要将新的空对象(或预定义的值)添加到dataTable集合中。 Angular会做到这一点。