Datatables 在渲染函数中传递自定义参数

Datatables 在渲染函数中传递自定义参数,datatables,datatables-1.10,angular-datatables,Datatables,Datatables 1.10,Angular Datatables,我有以下代码来创建列: DTColumnBuilder.newColumn(null).withTitle('Validation').renderWith(validationRenderer) 和渲染功能: function validationRenderer(data, type, full, meta) { ....... } 现在,我想将自定义参数传递给validationRenderer,以便在函数中访问它,如下所示: DTColumnBuilder.newColumn

我有以下代码来创建列:

DTColumnBuilder.newColumn(null).withTitle('Validation').renderWith(validationRenderer)
和渲染功能:

function validationRenderer(data, type, full, meta) {
    .......
}
现在,我想将自定义参数传递给
validationRenderer
,以便在函数中访问它,如下所示:

DTColumnBuilder.newColumn(null).withTitle('Validation').renderWith(validationRenderer('abc'))

function validationRenderer(data, type, full, meta, additionalParam) {
    // do something with additionalParam
}

我在文档中找不到它,但根据

的参考,必须在
meta
中传递附加参数。是的,您可以。或者,从技术上来说,你可以做得更好,但是你可以使用一个聪明的变通方法来处理你的问题

我今天遇到了这个问题,并找到了一个非常悲伤(但有效)的解决方案

基本上,最大的问题是render函数是传递给datatable处理程序的一个参数,它(当然)是隔离的

在我的例子中,为了制作一个实际的例子,我必须向动态数据表添加几个动态按钮,每个按钮都有不同的动作

显然,没有解决方案,直到我想到以下几点:问题似乎是渲染器函数的作用域有点孤立和不可访问。但是,由于函数的“return”仅在datatable有效呈现字段时才被调用,因此您可以将呈现函数包装在一个自定义的自调用匿名函数中,在那里提供参数,以便在呈现单元格时使用它们

考虑到以下几点,以下是我在实践示例中所做的:

  • 目标是将每一行的ID字段传递给几个不同的自定义函数,因此问题是在有效单击按钮时传递要调用的按钮的ID(因为在呈现按钮时无法获取其任何外部引用)
  • 我使用的是自定义类,如下所示:

    hxDatatableDynamicButton=函数(标签、onClick、类名){ this.label=标签; this.onClick=onClick; this.classNames=this.classNames | |“col5p文本中心”; }

基本上,它只是创建了一个我稍后使用的实例

在这种情况下,考虑有2个不同实例的<强>数组< /强>,其中一个具有“测试”标签,另一个具有“Test2”标签。

  • 我通过for循环注入这些实例,因此我需要将“I”传递给我的datatable,以知道按下了哪些按钮
由于代码实际上相当大(代码库非常大),下面是完成此技巧所需的相关代码段:

scope.datatableAdditionalActionButtons.reverse();
scope._abstractDynamicClick = function(id, localReferenceID) {
    scope.datatableAdditionalActionButtons[localReferenceID].onClick.call(null, id);
};
for (var i = 0; i < scope.datatableAdditionalActionButtons.length; i++) {
    var _localReference = scope.datatableAdditionalActionButtons[i];
    var hax = (function(i){
        var _tmp = function (data, type, full, meta) {
            var _label = scope.datatableAdditionalActionButtons[i].label;
            return '<button class="btn btn-default" ng-click="_abstractDynamicClick('+full.id+', '+i+')">'+_label+'</button>';
        }
        return _tmp;
    })(i);

    dtColumns.unshift(DTColumnBuilder.newColumn(null).notSortable().renderWith(hax).withClass(_localReference.classNames));
}
scope.datatableAdditionalActionButtons.reverse();
scope.\u abstractDynamicClick=函数(id,localReferenceID){
scope.datatableAdditionalActionButtons[localReferenceID].onClick.call(null,id);
};
对于(var i=0;i
那么,诀窍在哪里呢?技巧完全在hax函数中,这就是它工作的原因:我们使用的不是带有函数原型的常规渲染器,而是具有与默认渲染器相同参数(因此参数相同)的“自定义”渲染器。但是,它在一个自调用匿名函数中被隔离,这允许我们在其中任意注入一个参数,因此,在呈现时,允许我们区分它实际上是哪个“i”,因为在这种情况下,函数的隔离范围永远不会丢失

基本上,输出如下:

实际上,检查表明元素的呈现方式不同,因此每个“i”都被正确呈现,而如果函数没有被包装在一个自调用匿名函数中,它就不会被正确呈现:

所以,基本上,在你的情况下,你会这样做:

var _myValidator = (function(myAbcParam){
   var _validate = function (data, type, full, meta) {
      console.log("additional param is: ", myAbcParam); // logs "abc"
      return '<button id="'+myAbcParam+'">Hello!</button>'; // <-- renders id ="abc"
   }
   return _validate ;
})('abc');

DTColumnBuilder.newColumn(null).withTitle('Validation').renderWith(_myValidator);
// <-- note that _myValidator is passed instead of "_myValidator()", since it is already executed and already returns a function.
var\u myValidator=(函数(myAbcParam){
var\u validate=函数(数据、类型、完整、元){
log(“附加参数为:”,myAbcParam);//日志“abc”

return'Hello!';//我认为这是不可能的,因为你不能对
render()
方法进行猴子补丁。但是我很想看到解决这个问题的方法:)@davidkonrad:有点晚了,但是我已经找到了一个可能的解决方法,使用自调用匿名函数。这似乎是目前为止唯一可能的方法。