【问题标题】:ng-click not working with Datatable and Angular Jsng-click 不适用于 Datatable 和 Angular Js
【发布时间】:2017-09-29 08:41:07
【问题描述】:

我已经阅读了几个类似的问题,但没有一个对我有用。我正在使用带有角度 js 的 laravel-datatable。但是“ng-click”不适用于动态生成的数据表按钮。我读到了 $compile 但不知道如何用表来实现它。我对 Angular js 很陌生。

当我点击按钮时,什么也没有发生。

app.controller('myController', ['$scope','$compile', function($scope, $compile) {

$('#stafftbl').DataTable( {
      paging: true,
      "ordering": true,
      "searching": true,
      "bInfo" : true,
      deferRender: true,
      ajax: 'get_staffsalary',
      columns: [
          { data: 'staff_num', name: 'staff_num'},
          { data: 'staffname ', name: 'staffname' },
          { data: 'salary', name: 'salary' },
          { data: 'date_effected', name: 'date_effected' },
          { data: 'updated_at', name: 'updated_at' },
          { data: null, render: function (data, type, full) {
                  return '<button class="btn btn-xs btn-primary" ng-click="update('+full.id+')">Update Salary</button> ';
          }},

      ],

  });

   $scope.update= function (id) {
        alert(id)
    }
 }]);

请帮忙?

【问题讨论】:

标签: angularjs datatable


【解决方案1】:

是的,你是正确的,你需要使用 $compile。

在动态添加带有 angular 属性的 html 后,就像您使用数据表一样,您必须调用 $compile 以便 angular 可以获取属性。

您需要在 $scope 之后将 $compile 服务注入您的控制器。然后,在添加 HTML 之后,您需要编译新的 DOM 并将其链接到范围,方法是在控制器的上下文中调用 $compile(new_html)($scope)。

参考$compile doco

【讨论】:

  • 在哪里添加此代码? $compile(new_html)($scope)
  • 您的问题中的第一个代码块是从哪里调用的?如果在您的控制器中调用它,您应该能够在 DataTable 的回调中调用 $compile。我不熟悉您使用的 DataTable 插件,但它应该具有添加 html 时的回调选项。
  • 我现在已将代码移至我的控制器并编辑了问题。我在哪里调用 $compile(new_html)($scope)
  • 我已经正确添加了 $compile(new_html)($scope) ,现在可以正常工作了。我需要发布新代码作为答案吗?
  • 很高兴听到您成功了 :) 是的,添加您的解决方案作为答案。它可能会帮助其他人。如果我的回答对您有所帮助,我将不胜感激。谢谢。
【解决方案2】:

我使用 @MJL 的回答解决了这个问题。这是完整的代码块,它可能会帮助其他人

app.controller('myCtrl', ['$scope','$compile', function($scope, $compile) {

var table = $('#stafftbl').DataTable( {
    processing: false,
    serverSide: false,
    deferRender: true,
    ajax: 'get_staffsalary',
    columns: [
        { data: 'staff_num', name: 'staff_num'},
        { data: 'salary', name: 'salary' },
        { data: 'date_effected', name: 'date_effected' },
        { data: 'updated_at', name: 'updated_at' },
        { data: null, render: function (data, type, full) {
            return '<button class="btn btn-xs btn-primary text-size-small" ng-click="clickme()>Update</button> ';
        }},

    ],
    "createdRow": function ( row, data, index ) {
        $compile(row)($scope);  //add this to compile the DOM
    }

})

 $scope.clickme = function () {
   alert('clicked me')
}
}]);

【讨论】:

  • @PrashantPokhriyal,问题应该结束了,前几个问题完全1:1配音,上面的答案也是如此。
  • @PrashantPokhriyal,问题应该结束了,前几个问题完全1:1配音,上面的答案也是如此。
猜你喜欢
  • 2015-12-31
  • 2015-03-31
  • 2023-03-12
  • 1970-01-01
  • 2015-01-18
  • 2018-04-30
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
相关资源
最近更新 更多