是的,你可以。或者,更好的是,您在技术上可以,但您可以使用巧妙的解决方法来处理您的问题。
我今天遇到了这个问题,并找到了一个非常可悲(但有效)的解决方案。
基本上,最大的问题是渲染函数是传递给数据表处理程序的参数,它(当然)是隔离的。
在我的例子中,为了做一个实际的例子,我必须在动态数据表中添加几个动态按钮,每个按钮都有不同的操作。
显然,没有解决方案,直到我想到以下问题:问题似乎是渲染器函数范围有些孤立且无法访问。但是,由于仅当数据表有效地呈现字段时才调用函数的“返回”,因此您可以将呈现函数包装在 自定义自调用匿名函数中,并在其中提供参数以在单元格中使用它们正在渲染。
考虑到以下几点,这是我对实际示例所做的:
基本上,它只是创建一个我稍后使用的实例。
在这种情况下,考虑有一个包含 2 个不同实例的 数组,一个具有“test”标签,另一个具有“test2”标签。
- 我通过 for 循环注入这些实例,因此我需要将“i”传递给我的数据表以了解正在按下哪个按钮。
由于代码实际上相当大(代码库很大),这里是您完成这个技巧所需的相关 sn-p:
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));
}
那么,诀窍在哪里?诀窍完全在于 hax 函数,这就是它起作用的原因:我们使用的是“自定义”渲染,而不是传递常规的 renderWith 函数原型,它具有相同的参数(因此具有相同的参数) 作为默认值。但是,它隔离在一个自调用匿名函数中,这允许我们在其中任意注入一个参数,因此,允许我们在渲染时区分它实际上是哪个“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.
我知道这并不完全是人们期望的答案,但如果您需要在数据表中完成一些复杂的事情,看起来唯一可行的方法就是使用自调用匿名函数。
希望这可以帮助仍然遇到此问题的人。