Uncaught TypeError: b.$apply is not a function in angular-datatables
Uncaught TypeError: b.$apply is not a function in angular-datatables
我有这个错误:Uncaught TypeError: b.$apply is not a function 每次我点击编辑按钮(应该触发指令 ng-click 但它显示上面的错误)
这是docs
这里是html
<div class="card">
<div class="card-header">
<h1>Retenciones</h1>
</div>
<div class="card-body card-padding">
<div >
<table ng-if="retencionesController.authorized" dt-instance="retencionesController.dtInstance" datatable="" dt-options="retencionesController.dtOptions" dt-columns="retencionesController.dtColumns"
class="row-border hover"></table>
</div>
</div>
</div>
这是我的控制器
(function(){
angular.module('statusTrackAppApp').controller('retencionesController',retencionesController);
function retencionesController($http,apiPath,DTOptionsBuilder, DTColumnBuilder,$compile){
var vm=this;
vm.authorized = false;
vm.dtInstance = {};
vm.retencion ={};
$http.get(apiPath+'retenciones').then(function(response){
if(response.status ==200){
vm.authorized=true;
var facturas=response.data;
vm.dtOptions = DTOptionsBuilder.newOptions()
.withOption('data', facturas)
.withOption('createdRow', createdRow)
// .withOption('scrollY', 300)
.withPaginationType('full_numbers');
vm.dtColumns = [
DTColumnBuilder.newColumn('_id').withTitle('ID').notVisible(),
DTColumnBuilder.newColumn('noFactura').withTitle('Número de Factura'),
DTColumnBuilder.newColumn('importe').withTitle('Importe'),
DTColumnBuilder.newColumn('tipoMoneda').withTitle('Tipo de Moneda'),
DTColumnBuilder.newColumn('updates').withTitle('Comentarios/Updates'),
DTColumnBuilder.newColumn(null).withTitle('Acciones').notSortable().renderWith(actionButtons)
];
}
}).catch(function(error){
console.log(error);
});
function actionButtons(data,type,full,meta) {
vm.retencion[data._id]=data;
return '<button class="btn btn-info btn-sm" ng-click="retencionesController.editProject(retencionesController.retencion[\'' +data._id+ '\'])">'+
'Editar</button>'
}
function createdRow(row, data, dataIndex) {
// Recompiling so we can bind Angular directive to the DT
$compile(angular.element(row).contents())(vm);
}
vm.editProject = function(retencion){
console.log('it works'+ JSON.parse(retencion));
vm.dtInstance.reloadData();
}
}
})();
顺便说一句,我使用 ui-router
将控制器添加到视图中
找到解决方案,我应该使用 $scope 而不是 vm(其值为 'this')
正在替换
function createdRow(row, data, dataIndex) {
// Recompiling so we can bind Angular directive to the DT
$compile(angular.element(row).contents())(vm);
}
用这个
function createdRow(row, data, dataIndex) {
// Recompiling so we can bind Angular directive to the DT
$compile(angular.element(row).contents())($scope);
}
我有这个错误:Uncaught TypeError: b.$apply is not a function 每次我点击编辑按钮(应该触发指令 ng-click 但它显示上面的错误)
这是docs
这里是html
<div class="card">
<div class="card-header">
<h1>Retenciones</h1>
</div>
<div class="card-body card-padding">
<div >
<table ng-if="retencionesController.authorized" dt-instance="retencionesController.dtInstance" datatable="" dt-options="retencionesController.dtOptions" dt-columns="retencionesController.dtColumns"
class="row-border hover"></table>
</div>
</div>
</div>
这是我的控制器
(function(){
angular.module('statusTrackAppApp').controller('retencionesController',retencionesController);
function retencionesController($http,apiPath,DTOptionsBuilder, DTColumnBuilder,$compile){
var vm=this;
vm.authorized = false;
vm.dtInstance = {};
vm.retencion ={};
$http.get(apiPath+'retenciones').then(function(response){
if(response.status ==200){
vm.authorized=true;
var facturas=response.data;
vm.dtOptions = DTOptionsBuilder.newOptions()
.withOption('data', facturas)
.withOption('createdRow', createdRow)
// .withOption('scrollY', 300)
.withPaginationType('full_numbers');
vm.dtColumns = [
DTColumnBuilder.newColumn('_id').withTitle('ID').notVisible(),
DTColumnBuilder.newColumn('noFactura').withTitle('Número de Factura'),
DTColumnBuilder.newColumn('importe').withTitle('Importe'),
DTColumnBuilder.newColumn('tipoMoneda').withTitle('Tipo de Moneda'),
DTColumnBuilder.newColumn('updates').withTitle('Comentarios/Updates'),
DTColumnBuilder.newColumn(null).withTitle('Acciones').notSortable().renderWith(actionButtons)
];
}
}).catch(function(error){
console.log(error);
});
function actionButtons(data,type,full,meta) {
vm.retencion[data._id]=data;
return '<button class="btn btn-info btn-sm" ng-click="retencionesController.editProject(retencionesController.retencion[\'' +data._id+ '\'])">'+
'Editar</button>'
}
function createdRow(row, data, dataIndex) {
// Recompiling so we can bind Angular directive to the DT
$compile(angular.element(row).contents())(vm);
}
vm.editProject = function(retencion){
console.log('it works'+ JSON.parse(retencion));
vm.dtInstance.reloadData();
}
}
})();
顺便说一句,我使用 ui-router
将控制器添加到视图中找到解决方案,我应该使用 $scope 而不是 vm(其值为 'this')
正在替换
function createdRow(row, data, dataIndex) {
// Recompiling so we can bind Angular directive to the DT
$compile(angular.element(row).contents())(vm);
}
用这个
function createdRow(row, data, dataIndex) {
// Recompiling so we can bind Angular directive to the DT
$compile(angular.element(row).contents())($scope);
}