行绘制损坏的 renderWith 函数
Row draw corrupt renderWith function
我正在使用以下渲染函数渲染列:
DTColumnBuilder.newColumn(null).withTitle('Validation').renderWith(validationRenderer)
function validationRenderer(data, type, full, meta) {
return '<div class="btn-group">' +
'<label class="btn btn-default btn-sm">' +
'<input ng-click="vm.toggleValidation($event, ' + data.id + ', '+meta.row+', '+meta.col+')" name="validation'+data.id+'" type="radio" autocomplete="off" value="YES"> Yes' +
'</label>' +
'<label class="btn btn-default btn-sm">' +
'<input ng-click="vm.toggleValidation($event, ' + data.id + ', '+meta.row+', '+meta.col+')" name="validation'+data.id+'" type="radio" autocomplete="off" value="NO"> No' +
'</label>' +
'</div>';
}
当用户点击单选按钮时,下面的vm.toggleValidation
函数被触发:
vm.toggleValidation = toggleValidation;
function toggleValidation(event, id, rowNum, colNum) {
event.stopPropagation();
// call to a server and then redraw ...
$log.info('Updating row and re-drawing it..');
var table = vm.dtInstance.DataTable;
var row = table.row(rowNum);
var rowData = row.data();
rowData.validation = event.target.value;
table.row(rowNum).data(rowData).draw(false);
}
渲染的单选按钮在重绘完成后立即停止工作。我可以看到单选按钮,但 toggleValidation
在单击单选按钮时没有被调用。单选按钮只工作一次。如果我删除 draw
函数,它会完美地工作,所以在重绘行时会出现问题。
我无法复制您的场景,但是:原因是您实际上通过 draw()
修改了 DOM 并且 angular 指令被重置。您需要使用 $compile
重新初始化指令。我猜下面的方法会起作用:
table.row(rowNum).data(rowData).draw(false);
$compile( table.row(rowNum).nodes() )($scope);
如果不起作用,请添加
$timeout(function() {
$scope.$digest()
})
还有。但是觉得没必要。
您要附加一个引用当前范围的模板(请参阅对 vm.toggleValidation
的调用),这需要显式调用 $compile 方法,否则元素不会绑定到范围并将呈现为静态内容。
DTColumnBuilder.newColumn(null).withTitle('Validation')
.renderWith($compile(validationRenderer)($scope))
我正在使用以下渲染函数渲染列:
DTColumnBuilder.newColumn(null).withTitle('Validation').renderWith(validationRenderer)
function validationRenderer(data, type, full, meta) {
return '<div class="btn-group">' +
'<label class="btn btn-default btn-sm">' +
'<input ng-click="vm.toggleValidation($event, ' + data.id + ', '+meta.row+', '+meta.col+')" name="validation'+data.id+'" type="radio" autocomplete="off" value="YES"> Yes' +
'</label>' +
'<label class="btn btn-default btn-sm">' +
'<input ng-click="vm.toggleValidation($event, ' + data.id + ', '+meta.row+', '+meta.col+')" name="validation'+data.id+'" type="radio" autocomplete="off" value="NO"> No' +
'</label>' +
'</div>';
}
当用户点击单选按钮时,下面的vm.toggleValidation
函数被触发:
vm.toggleValidation = toggleValidation;
function toggleValidation(event, id, rowNum, colNum) {
event.stopPropagation();
// call to a server and then redraw ...
$log.info('Updating row and re-drawing it..');
var table = vm.dtInstance.DataTable;
var row = table.row(rowNum);
var rowData = row.data();
rowData.validation = event.target.value;
table.row(rowNum).data(rowData).draw(false);
}
渲染的单选按钮在重绘完成后立即停止工作。我可以看到单选按钮,但 toggleValidation
在单击单选按钮时没有被调用。单选按钮只工作一次。如果我删除 draw
函数,它会完美地工作,所以在重绘行时会出现问题。
我无法复制您的场景,但是:原因是您实际上通过 draw()
修改了 DOM 并且 angular 指令被重置。您需要使用 $compile
重新初始化指令。我猜下面的方法会起作用:
table.row(rowNum).data(rowData).draw(false);
$compile( table.row(rowNum).nodes() )($scope);
如果不起作用,请添加
$timeout(function() {
$scope.$digest()
})
还有。但是觉得没必要。
您要附加一个引用当前范围的模板(请参阅对 vm.toggleValidation
的调用),这需要显式调用 $compile 方法,否则元素不会绑定到范围并将呈现为静态内容。
DTColumnBuilder.newColumn(null).withTitle('Validation')
.renderWith($compile(validationRenderer)($scope))