Нг-повторить, пытаясь создать счетчик индекса

0

У меня есть таблица, в которой я автоматически увеличиваю каждую строку с учетом выбора пользователя.

Проблема, с которой я столкнулась, - ng-repeat копирует столбец, который я не могу различить между ними. Например, каждая ячейка в столбце нумеруется с использованием индекса. Я хотел бы иметь способ определить, где пользователь нажимает на ячейку.

<table class="table table-bordered">
        <thead>
         <tr>
           <th></th>
           <th style="table-layout:fixed; text-align: center;" scope="col" colspan="2">Sales</th>
           <th style="table-layout:fixed; text-align: center;" scope="col" colspan="2">Service</th>
           <th style="table-layout:fixed; text-align: center;" scope="col" colspan="2">Accounting</th>
           <th style="vertical-align:top; text-align: center;" scope="col" colspan="2">Parts</th>
           <th style="vertical-align:top; text-align: center;" scope="col" colspan="2">Body Shop</th>
           <th style="vertical-align:top; text-align: center;" scope="col" colspan="2">Other</th>
         </tr>
         <tr>
           <th></th>
           <th class="start-end-time" style="text-align: center; font-size: .9em; color: #999;">Start</th>
           <th class="start-end-time" style="text-align: center; font-size: .9em; color: #999;">End</th>
           <th class="start-end-time" style="text-align: center; font-size: .9em; color: #999;">Start</th>
           <th class="start-end-time" style="text-align: center; font-size: .9em; color: #999;">End</th>
           <th class="start-end-time" style="text-align: center; font-size: .9em; color: #999;">Start</th>
           <th class="start-end-time" style="text-align: center; font-size: .9em; color: #999;">End</th>
           <th class="start-end-time" style="text-align: center; font-size: .9em; color: #999;">Start</th>
           <th class="start-end-time" style="text-align: center; font-size: .9em; color: #999;">End</th>
           <th class="start-end-time" style="text-align: center; font-size: .9em; color: #999;">Start</th>
           <th class="start-end-time" style="text-align: center; font-size: .9em; color: #999;">End</th>
           <th class="start-end-time" style="text-align: center; font-size: .9em; color: #999;">Start</th>
           <th class="start-end-time" style="text-align: center; font-size: .9em; color: #999;">End</th>
         </tr>
         </thead>
           <tr ng-repeat="time in times">
               <td>{{weekdays[$index]}}</td>
               <td class="start-end-time" updated-row ng-repeat-start="(key,dept) in time" data-index="{{[key]}} start" editable-field time="dept.start"></td>
               <td class="start-end-time" updated-row="{{$index}}" data-index="{{[key]}}" ng-repeat-end editable-field  time="dept.end"></td>

               <!-- {{times[$index][key].start}} -->
               Monday Service start time {{times[0] |date: "shortTime"}}
               <!-- <div id="HoursTable" newtable></div> -->

Мой контроллер

pp.controller('main', ['$scope', '$location', function($scope, $location) {

    $scope.times = [];
    $scope.timeArr = [];
    $scope.timeObj = {};
    $scope.clickedIndex;

    $scope.departments = ["sales", "service", 'accounting', 'parts', 'bodyShop', 'other'];
    $scope.weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];

    $.each($scope.weekdays, function(index, value) {
        var dayTimes = {};
        $.each($scope.departments, function(index, value) {
            dayTimes[value] = {
                start: '',
                end: ''
            };
        });
        $scope.times.push(dayTimes);
    });
}]);

Я попытался создать атрибут data, называемый data-index="{{$index+=1}}"

Надеюсь, мой пример имеет немного смысл. В двух словах, мне нужно будет предоставить каждой ячейке в столбце идентификатор. Как и сейчас, все они имеют то же значение, что мешает мне применять любую условную логику.

                  <-- Updated -->
  Located in the hours table page
  ng-init="number = countInit()" 

  controller I added this piece of code as well:

 $scope.countInit = function() {

   return $scope.totalCount++;

}

Когда я пытаюсь отобразить результаты в своей таблице, используя этот синтаксис data-index={{number}}

Мои результаты пустые. Как это может быть? Я почти чувствую, как Угловая играет на меня шутку. Или это может быть мое невежество. Я предпочитаю верить первому.

Я думал, что мое решение будет работать. Интересно, где я пошла не так. Может ли любая смиренная душа помочь мне?

  • 0
    Сообщество Stackflow Есть ли что-нибудь, что я могу сделать, чтобы увеличить свои шансы на получение помощи?
Теги:
ng-repeat

2 ответа

0

Вы можете просто так,

        var index = 1;
        countIndex = function () {
            return index++;
        }

        $scope.dtColumns = [
            DTColumnBuilder.newColumn(countIndex, "Sr No"),
            DTColumnBuilder.newColumn("some_column_name", "ID").notVisible(),
            DTColumnBuilder.newColumn("some_column_name", "Data"),
            DTColumnBuilder.newColumn("some_column_name", "Status").renderWith(function (data, type) {
                return data == null ? 'Clean' : data;
            }),
            DTColumnBuilder.newColumn("update_date", "Update Date").renderWith(function (data, type) {
                return $filter('date')(data.replace('/Date(', '').replace(')/', ''), 'dd-MMM-yyyy HH:mm:ss');
            })
        ];

Это самый простой способ использования индекса с угловым datatable.

0

Вы пробовали Угловые данные? Ваша html-разметка для таблицы выглядит немного сломанной. Угловые данные занимали некоторое время, чтобы понять и подключиться, но, безусловно, стоит усилий, вы просто создаете свои данные JSON так, как вы этого хотите, и загружаете в Angular-datatables, тогда структура таблицы создается для вас.

Хотите разбивать на страницы? или экспортировать в PDF/Excel? или вы хотите выполнить поиск в таблице или отсортировать ее? У вас еще есть много работы, прежде чем вы приблизитесь к этой библиотеке. Вот некоторые из моих кодов Angular-datatables, которые я использую для ввода таблицы в DOM:

            // Bind a click handler to each row
            var myCallback = function (nRow, aData, iDisplayIndex, iDisplayIndexFull) {
                $('td', nRow).off("click").bind('click', function () {

// Do something with the row being clicked
console.log(aData);
                });
                return nRow;
            };
$scope.dtOptions = DTOptionsBuilder.fromSource(json.data)                       
                    .withBootstrap()
                    .withButtons(dt_conf.dt_btns)
                    .withOption('fnRowCallback', myCallback)
                    .withOption('order', [[3, "desc"]])
                    .withOption('bDeferRender', dt_conf.defer_render)
                    .withOption('iDisplayLength', dt_conf.dt_length)
                    .withOption("dom", dt_conf.dt_dom)
                    .withPaginationType(dt_conf.paging_type)
                    .withOption('lengthMenu', dt_conf.lengthMenu)
                    .withOption('responsive', true)
                    .withOption('stateSave', dt_conf.save_state);

//The Columns should match your JSON structure
                $scope.dtColumns = [
                    DTColumnBuilder.newColumn('id').withTitle('Id'),
                    // DTColumnBuilder.newColumn('file_id').withTitle('File Id').notVisible(),
                    // DTColumnBuilder.newColumn('file_num').withTitle('File Num').notVisible(),
                    DTColumnBuilder.newColumn('date_time').withTitle('Date Time'),
                    DTColumnBuilder.newColumn('payment_type_id').withTitle('Payment Type Id'),
                    DTColumnBuilder.newColumn('description').withTitle('Description'),
                    DTColumnBuilder.newColumn('creditor').withTitle('Creditor'),
                    DTColumnBuilder.newColumn('amount').withTitle('Amount').renderWith(dt_conf.fnRenderMoney),
                    DTColumnBuilder.newColumn('vat_amount').withTitle('Vat Amount').renderWith(dt_conf.fnRenderMoney),
                    DTColumnBuilder.newColumn('bank').withTitle('Bank').notVisible(),
                    DTColumnBuilder.newColumn('branch_name').withTitle('Branch Name').notVisible(),
                    DTColumnBuilder.newColumn('branch_code').withTitle('Branch Code').notVisible()] 


// Inject the table into your DOM at element (el) and compile with your options.

angular.element(el).html("").append($compile('<table id="' + tid + '" datatable="" ' +
                            'dt-options="{{ dtOptions }}" ' +
                            'dt-columns="{{ dtColumns }}" ' +
                            'class="table table-condensed table-hover table-striped" ' +
                            'style="width:100%"></table>')($scope));

И вот моя фабрика, чтобы настроить параметры для своих DataTables (брал у меня часы, чтобы собрать все варианты, их много, и получить это именно так, как мне нравится! (Интернет говорит "Спасибо!")

app.factory('dt_get', function ($filter) {

    return {
        conf : function conf(xtitle, xmsg) {

            var result = [];
            var xtitle = xtitle; // Title for the exported pdf,xls
            var xmsg = xmsg;     // Subtitle for the exported pdf,xls
            result.paging_type = "full_numbers";
            result.lengthMenu = [[ 5, 10, 15, 50, -1 ],[ 5, 10, 15, 50, "All" ]];
            result.defer_render = true;
            result.save_state = true; //Remember table positions and settings
            result.dt_dom = "<'container-fluid'<'row'<'col-sm-3 text-left'f><'col-sm-6 center-block'p><'col-sm-3 text-right'i>>" +
                    //"<'row'<'col-sm-12 dt-bold'i>>" +
                "<'row'<'col-sm-12'<'panel panel-default'tr>>>" +
                "<'row'<'col-sm-2 text-left'l><'col-sm-6 center-block'p><'col-sm-4 text-right'B>>>";
            result.dt_length = 10;
            result.fnRenderYesNo = function (data, type, full) {
                if (data == "1") {
                    return "<b class='text-success'>YES</b>"
                } else {
                    return "<b class='text-danger'>NO</b>"
                }
            };
            result.fnRenderYesNoInvert = function (data, type, full) {
                if (data == "1") {
                    return "<b class='text-danger'>NO</b>"
                } else {
                    return "<b class='text-success'>YES</b>"
                }
            };

            result.fnRenderMoney = function (data, type, full) {
                    if (data < 0) {
                        return "<b class='text-danger'>" + $filter('currency')(data, 'R ', 2) + "</b>";    //could use currency/date or any angular filter
                    } else {
                        return $filter('currency')(data, 'R ', 2);    //could use currency/date or any angular filter
                    }
            };
            result.dt_btns = [
                {
                    extend: 'colvis',
                    text: 'Edit Cols'
                },
                {
                    extend: 'copyHtml5',
                    text: 'Copy',
                    title: xtitle,
                    message: xmsg,
                    exportOptions: {
                        columns: ':visible'
                    }
                },
                {
                    extend: 'print',
                    text: 'Print',
                    title: xtitle,
                    message: xmsg,
                    exportOptions: {
                        columns: ':visible'
                    }
                },
                {
                    extend: 'excelHtml5',
                    text: 'Excel',
                    title: xtitle,
                    message: xmsg,
                    filename: xtitle + ".xlsx",
                    exportOptions: {
                        columns: ':visible'
                    }
                },
                {
                    extend: 'pdfHtml5',
                    text: 'Pdf',
                    title: xtitle,
                    message: xmsg,
                    filename: xtitle + ".pdf",
                    exportOptions: {
                        columns: ':visible'
                    }
                }
            ]
            return result;
        }

    }

});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню