2017-06-19 28 views
2

有人可以幫我rowCallback。問題是,我有一張桌子,您可以點擊桌子行上的任意位置查看點擊項目的開放信息。在第一次TD上我設置了複選框。但是當我檢查複選框時,我不想打開信息。 這裏是Angularjs datatables - rowCallback事件

var vm = this; 
    vm.selected = {}; 
    vm.selectAll = false; 
    vm.toggleAll = toggleAll; 
    vm.toggleOne = toggleOne; 

    var titleHtml = '<input type="checkbox" ng-model="showCase.selectAll" ng-click="showCase.toggleAll(showCase.selectAll, showCase.selected)">'; 


    function getUserTokenFromLocalStorage(localStorage) { 
     var authData = []; 
     for (key in localStorage) { 
      if (key == "ls.authorizationData") { 
       authData = localStorage[key]; 
      } 

     } 

     var jsonObj = JSON.parse(authData); 
     return jsonObj.token; 
    }; 


    var vm = this; 
    vm.message = ''; 
    vm.someClickHandler = someClickHandler; 
    vm.dtOptions = DTOptionsBuilder.newOptions() 
     .withOption('ajax', { 
      // Either you specify the AjaxDataProp here 
      // dataSrc: 'data', 
      url: serviceBase + 'test', 
      type: 'POST', 
      headers: { 
       'xtoken': 'Bearer ' + getUserTokenFromLocalStorage(localStorage) 
      } 
     }) 
     // or here 
     .withDataProp('data') 
     .withOption('processing', true) 
     .withOption('serverSide', true) 
     .withOption('rowCallback', rowCallback) 
     .withOption('createdRow', function(row, data, dataIndex) { 
      // Recompiling so we can bind Angular directive to the DT 
      $compile(angular.element(row).contents())($scope); 
     }) 
     .withOption('headerCallback', function(header) { 
      if (!vm.headerCompiled) { 
       // Use this headerCompiled field to only compile header once 
       vm.headerCompiled = true; 
       $compile(angular.element(header).contents())($scope); 
      } 
     }) 
     .withPaginationType('full_numbers') 


    vm.dtColumns = vm.dtColumns = [ 
     DTColumnBuilder.newColumn(null).withTitle(titleHtml).notSortable() 
     .renderWith(function(data, type, full, meta) { 
      vm.selected[full.id] = false; 
      return '<input type="checkbox" ng-model="showCase.selected[' + data.id + ']" ng-click="showCase.toggleOne(showCase.selected)">'; 
     }), //don't change state when click on this TD, only check checkbox. 
     DTColumnBuilder.newColumn('id').withTitle('ID'), 
     DTColumnBuilder.newColumn('type').withTitle('Type'), 
     DTColumnBuilder.newColumn('city').withTitle('City'), 
     DTColumnBuilder.newColumn('country').withTitle('Country'), 
     DTColumnBuilder.newColumn('last_report_dt').withTitle('Last report'), 
     DTColumnBuilder.newColumn('hardware_version').withTitle('HW version'), 
     DTColumnBuilder.newColumn('rpi_image_version').withTitle('Image version'), 
     DTColumnBuilder.newColumn('software_version').withTitle('Code version'), 
     DTColumnBuilder.newColumn('internal_note').withTitle('Internal note'), 
     DTColumnBuilder.newColumn(null).withTitle('Info').notSortable() 
     .renderWith(function(data, type, full, meta) { 
      vm.selected[full.id] = false; 
      return '<a class="btn btn-default" ng-href="info/' + data.id + '">Info</a>'; 
     }), 
    ]; 

    function toggleAll(selectAll, selectedItems) { 
     for (var id in selectedItems) { 
      if (selectedItems.hasOwnProperty(id)) { 
       selectedItems[id] = selectAll; 
      } 
     } 
    } 

    function toggleOne(selectedItems) { 
     for (var id in selectedItems) { 
      if (selectedItems.hasOwnProperty(id)) { 
       if (!selectedItems[id]) { 
        vm.selectAll = false; 
        return; 
       } 
      } 
     } 
     vm.selectAll = true; 
    } 


    function someClickHandler(info) { 
     vm.message = info.id; 
     $location.path('info/' + info.id); 

    } 

    function rowCallback(nRow, aData, iDisplayIndex, iDisplayIndexFull) { 
     // Unbind first in order to avoid any duplicate handler (see https://github.com/l-lin/angular-datatables/issues/87) 
     $('td', nRow).unbind('click'); 
     $('td', nRow).bind('click', function() { 
      $scope.$apply(function() { 
       vm.someClickHandler(aData); 
      }); 
     }); 
     return nRow; 
    } 


} 

回答

2

有了這個問題我自己更好的解釋 enter image description here

我的代碼圖像。我認爲你的方法有點倒退。您在rowCallback內聲明td點擊處理程序,只是爲了能夠傳遞該ID。相反,我會推薦這樣的:

  1. 添加no-click類的第一列,以防止點擊:

    DTColumnBuilder.newColumn(null).withTitle(titleHtml).notSortable() 
        .withClass('no-click') 
        .renderWith(function(data, type, full, meta) { 
        vm.selected[full.id] = false; 
        return '<input type="checkbox" ng-model="showCase.selected[' + data.id + ']" ng-click="showCase.toggleOne(showCase.selected)">'; 
        }), 
    
  2. 更改rowCallback做什麼,但注入id作爲屬性到行:

    function rowCallback(nRow, aData, iDisplayIndex, iDisplayIndexFull) { 
        $(nRow).attr('data-id', aData.id); 
    } 
    
  3. td上創建委託事件處理程序以替換內外rowCallback事件處理程序和您的someClickHandler()

    $('#tableid').on('click', 'tbody td:not(.no-click)', function() { 
        var id = $(this).parent().attr('data-id'); 
        vm.message = id; 
        $location.path('info/' + id); 
    }) 
    
+0

謝謝大衛 – Arter

+0

謝謝謝謝謝謝你這麼多的這個解決方案已經打消了我的頭痛... –