Подтвердить что ты не робот

Ng-click не работает AngularJS и dataTables

Я написал директиву dataTables для AngularJS. Он работает отлично, за исключением того, что я пытаюсь добавить кнопку в строку, которая удаляет строку с помощью ng-click.

По-моему, проблема возникает из-за того, что строка таблицы теперь не является областью.

Может кто-нибудь помочь мне решить эту проблему.

jsFiddle Пример: http://jsfiddle.net/A5Zvh/7/

Моя директива выглядит так.

angular.module('DataTables', [])
.directive('datatable', function() {
    return {
        restrict: 'E',
        transclude: true,
        replace: true,
        require: 'ngModel',
        template: '<table></table>',
        link: function(scope, element, attrs, model) {
            var dataTable = null,
                options;

            var buttons = jQuery.parseJSON(attrs['buttons']) || null;

            options  = {
                    "bJQueryUI": false,
                    "sDom": "<'row-fluid'<'span4'l><'span8 filter' <'pull-right'T> <'pull-right'f>>r>t<'row-fluid'<'span6'i><'span6'p>>",
                    "sPaginationType": "bootstrap",
                    "oTableTools": {
                    }
                };

            if(_.has(attrs, 'datatableOptions')) {
                jQuery.extend(true, options, scope.$eval(attrs['datatableOptions']));
            }

            scope.$watch(attrs.ngModel, function(data) {
                if(data && _.size(data.aaData) > 0 && _.size(data.aoColumns) > 0) {

                    _.extend(options, scope.$eval(attrs.ngModel))
                    dataTable = $(element).dataTable(options);
                    dataTable.fnClearTable();
                    dataTable.fnAddData(data.aaData);
                }
            });
        }
    }
})
4b9b3361

Ответ 1

Я использую Angular -datatbles, и я пытался динамически добавлять, редактировать и удалять ссылки на строки данных и отображать их модальный на ng-click;

Это было решение для моего случая;

$scope.dtOptions.withOption('fnRowCallback',
     function (nRow, aData, iDisplayIndex, iDisplayIndexFull) {
        $compile(nRow)($scope);
     });

Весь код привязки данных

$scope.reloadData = function () {
    $scope.dtOptions.reloadData();
};

$scope.dtColumnDefs = [

    DTColumnDefBuilder.newColumnDef(2).renderWith(function (data, type, row) {
        var html = '<a href="" class="txt-color-blue pull-left" ng-click="editModal()"><i class="fa fa-pencil hidden-xs"></i> Edit</a>' +
                   '<a href="" class="txt-color-red padding-top-15" ng-click="removeModal()"><i class="fa fa-times hidden-xs"></i> Remove</a>';
        return html;
    })
];

$scope.dtColumns = [
    DTColumnBuilder.newColumn('name').withTitle('Name'),
    DTColumnBuilder.newColumn('type').withTitle('Type'),
    DTColumnBuilder.newColumn('id').withTitle(''),
];

$scope.dtOptions.withOption('fnRowCallback',
     function (nRow, aData, iDisplayIndex, iDisplayIndexFull) {
        $compile(nRow)($scope);
     });

Ответ 2

Я решил это, пройдя каждый td и вызывая $compile. Использование функции обратного вызова строки. Надеюсь, это поможет.

options.fnCreatedCell =  function (nTd, sData, oData, iRow, iCol) {
    $compile(nTd)($scope);
}

//or row

options.fnCreatedRow = function( nRow, aData, iDataIndex ) {
    $compile(nRow)($scope);
}

Ответ 3

Функция удаления в вашем контроллере не вызывается, потому что AngularJS ничего не знает о вводе этих элементов в DataTables в DOM, поэтому директива ngClick внутри этих элементов не компилируется и не связывается. Итак, измените:

dataTable.fnAddData(data.aaData);

Для

dataTable.fnAddData(data.aaData);
$compile(element)(scope);

И для того, чтобы вставить $compile service:

.directive('datatable', function () {

Для

.directive('datatable', function ($compile) {

И ваша функция удаления нарушена в jsFiddle, надеюсь, что это не так в вашем реальном проекте!

Ответ 4

Возможно, вы захотите взглянуть на первую пару сообщений Zdam на этот поток Google Groups, особенно на его/ее два связанных jsFiddles, Я в основном скопировал их, и они работают на базовом уровне. Я еще не попытался выполнить некоторые действия, начиная с щелчка по строке.

Я вижу, что вы внедрили немного другой подход, воссоздав <table> HTML node вообще. Не уверен, что это вызывает проблемы.

Кстати, по вызову scope.$watch мне пришлось убедиться, что для третьего параметра установлено значение true, чтобы провести сравнение значений (вместо сравнения ссылок) с возвращаемым ресурсом $object. Не знаете, почему вам это не нужно.

Ответ 5

fnCreatedCell будет поставляться в aoColumns или fnCreatedRow, поставляемом в mRender

1) fnCreatedCell основан на столбцах

ex:

tableElement.dataTable({
                "bDestroy": true,
                oLanguage : {
                       sLengthMenu : '_MENU_ records per page'
                },
               aoColumnDefs: [
         {
               bSortable: false,
               aTargets: [ -1,-2,-3 ],
               "fnCreatedCell": function (nTd, sData, oData, iRow, iCol)         
                         {  
                            $compile(nTd)($scope)
                          }
          }
        ],

2) fnCreatedRow - это обратный вызов верхнего уровня

tableElement.dataTable({
                "bDestroy": true,
                oLanguage : {
                       sLengthMenu : '_MENU_ records per page'
                },
        aoColumnDefs: [
        {
          bSortable: false,
          aTargets: [ -1,-2,-3 ]
         }
         ],
         "fnCreatedRow": function( nRow, aData, iDataIndex ){
                    compile(nRow)(scope);
            },