Angularjs-NgTable получил неопределенный в перезагрузке

я использую Angularjs NgTable, с разбиением на страницы внутри tabпредоставленного Angularjs материала. это работает отлично. я использовал его во многих частях моего проекта и много раз загружал его в разных частях.

но в этом случае я не могу перезагрузить таблицы. и не знаю, в чем проблема или как shoud сделать перезагрузку.

у меня в DistribucionControllerэтом функции:

$scope.listaFacturaTierra = function () {
    var idFactura = $stateParams.idFactura;
    $facturaTierra = distribucionService.getStockTierra(idFactura);
    $facturaTierra.then(function (datos) {
        $scope.facturaTierra = datos.data;
        var data = datos;
        $scope.tableFacturaTierra = new NgTableParams({
            page: 1,
            count: 8
        }, {
            total: data.length,
            getData: function (params) {
                data = $scope.facturaTierra;
                params.total(data.length);
                if (params.total() <= ((params.page() - 1) * params.count())) {
                    params.page(1);
                }
                return data.slice((params.page() - 1) * params.count(), params.page() * params.count());
            }});
    });
};

$scope.listaFacturaBebelandia = function () {
    var idFactura = $stateParams.idFactura;
    $facturaBebelandia = distribucionService.getStockBebelandia(idFactura);
    $facturaBebelandia.then(function (datos) {
        var data = datos.data;
        $scope.facturaBebelandia = datos.data;
        $scope.tableFacturaBebelandia = new NgTableParams({
            page: 1,
            count: 10
        }, {
            total: data.length,
            getData: function (params) {
                data = $scope.facturaBebelandia;
                params.total(data.length);
                if (params.total() <= ((params.page() - 1) * params.count())) {
                    params.page(1);
                }
                return data.slice((params.page() - 1) * params.count(), params.page() * params.count());
            }});
    });
};
$scope.listaFacturaLibertador = function () {
    var idFactura = $stateParams.idFactura;
    $facturaLibertador = distribucionService.getStockLibertador(idFactura);
    $facturaLibertador.then(function (datos) {
        var data = datos.data;
        $scope.facturaLibertador = datos.data;
        $scope.tableFacturaLibertador = new NgTableParams({
            page: 1,
            count: 10
        }, {
            total: data.length,
            getData: function (params) {
                data = $scope.facturaLibertador;
                params.total(data.length);
                if (params.total() <= ((params.page() - 1) * params.count())) {
                    params.page(1);
                }
                return data.slice((params.page() - 1) * params.count(), params.page() * params.count());
            }});
    });
};

они отображаются нормально, и разбиение на страницы также работает.

I add elements using Angularjs Material ngDialog using 3 functions the make the process.

Показать основной модальный:

$scope.distribuirModal = function (producto) {
    $rootScope.modalProducto = producto;
    ngDialog.open({
        template: 'views/modals/distribucion/modal-distribuir.html',
        className: 'ngdialog-theme-advertencia',
        showClose: false,
        controller: 'DistribucionController',
        closeByDocument: false,
        closeByEscape: false
    });
};

сделайте процессы данных, и покажите модал подтверждения:

$scope.confirmarDistribuir = function (modalDistribuir) {
    var control = 0;
    control = modalDistribuir.tierra + modalDistribuir.bebelandia + modalDistribuir.libertador;
    if (control === $rootScope.modalProducto.cantidadTotal) {
        if (modalDistribuir.tierra !== null) {
            $scope.wrapper.stockTierra.idProducto = $rootScope.modalProducto;
            $scope.wrapper.stockTierra.cantidad = modalDistribuir.tierra;
        }
        if (modalDistribuir.bebelandia !== null) {
            $scope.wrapper.stockBebelandia.idProducto = $rootScope.modalProducto;
            $scope.wrapper.stockBebelandia.cantidad = modalDistribuir.bebelandia;
        }
        if (modalDistribuir.libertador !== null) {
            $scope.wrapper.stockLibertador.idProducto = $rootScope.modalProducto;
            $scope.wrapper.stockLibertador.cantidad = modalDistribuir.libertador;
        }
        ngDialog.open({
            template: 'views/modals/distribucion/confirmacion-distribuir.html',
            className: 'ngdialog-theme-advertencia',
            showClose: false,
            controller: 'DistribucionController',
            closeByDocument: false,
            closeByEscape: false,
            data: {
                'wrapper': $scope.wrapper,
                'producto': $rootScope.modalProducto
            }
        });
    } else {
        $scope.alerts.push({
            type: 'danger',
            msg: 'La cantidad total de productos a distribuir debe ser igual a la cantidad total de productos en almacen.'
        });
    }
};

в этом модальном режиме я выполняю функцию, которая сохраняет данные на моем API

$scope.finalizarDistribucion = function () {
    $scope.sendWrapper = {
        stockTierra: null,
        stockBebelandia: null,
        stockLibertador: null
    };
    if ($scope.ngDialogData.wrapper.stockTierra.idProducto !== null && $scope.ngDialogData.wrapper.stockTierra.cantidad) {
        $scope.sendWrapper.stockTierra = $scope.ngDialogData.wrapper.stockTierra;
    }
    if ($scope.ngDialogData.wrapper.stockBebelandia.idProducto !== null && $scope.ngDialogData.wrapper.stockBebelandia.cantidad) {
        $scope.sendWrapper.stockBebelandia = $scope.ngDialogData.wrapper.stockBebelandia;
    }
    if ($scope.ngDialogData.wrapper.stockLibertador.idProducto !== null && $scope.ngDialogData.wrapper.stockLibertador.cantidad) {
        $scope.sendWrapper.stockLibertador = $scope.ngDialogData.wrapper.stockLibertador;
    }
    $distribute = distribucionService.add($scope.sendWrapper);
    $distribute.then(function (datos) {
        if (datos.status === 200) {
            ngDialog.closeAll();
            toaster.pop({
                type: 'success',
                title: 'Exito',
                body: 'Se ha distribuido con exito los productos.',
                showCloseButton: false
            });
        }
    });
    $scope.$emit('updateTables', $scope.ngDialogData.producto);
    $scope.$emit('updateStock', {});
};

в этой функции я делаю два $emit

первый обновить объект Productoв my ProductoControllerи отправить $broadcastдля обновления основной таблицы

$scope.$on('updateTables', function (event, object) {
    var idFactura = parseInt($stateParams.idFactura);
    object.estadoDistribucion = true;
    $updateProducto = _productoService.update(object);
    $updateProducto.then(function (datos) {
        if (datos.status === 200) {
            $rootScope.$broadcast('updateTableProducto', {'idFactura': idFactura});
        }
    });
});

это последнее работает отлично, перезагрузить таблицу без проблем.

вторая $emitпроблема, она должна перезагрузить еще 3 таблицы

$scope.$on('updateStock', function () {
    var idFactura = parseInt($stateParams.idFactura);
    $facturaTierra = distribucionService.getStockTierra(idFactura);
    $facturaTierra.then(function (datos) {
        $scope.facturaTierra = datos.data;
        $scope.tableFacturaTierra.reload();
    });
    $facturaBebelandia = distribucionService.getStockBebelandia(idFactura);
    $facturaBebelandia.then(function (datos) {
        $scope.facturaBebelandia = datos.data;
        $scope.tableFacturaBebelandia.reload();
    });
    $facturaLibertador = distribucionService.getStockLibertador(idFactura);
    $facturaLibertador.then(function (datos) {
        $scope.facturaLibertador = datos.data;
        $scope.tableFacturaLibertador.reload();
    });
});

но мои параметры ngTable undefinedи перезагрузка не удается.

кто-нибудь знает, что я делаю не так?

1 ответ

  1. Наконец после попытки много раз я получил ответ.

    Первый в моем ProductoControllerя сделал а $broadcastк моему DistribucionController

    $rootScope.$on('updateTableProducto', function (event, object) {
        $list = _productoService.searchByIdFactura(object.idFactura);
        $list.then(function (datos) {
            $scope.productosFactura = datos.data;
            $rootScope.$broadcast('updateStock', {});
            $scope.tableProductosFactura.reload();
        });
    });
    

    затем я получаю это $broadcastна моем другом контроллере с помощью

    $scope.$on('updateStock', function (event, object) {
        var idFactura = parseInt($stateParams.idFactura);
        $facturaTierra = distribucionService.getStockTierra(idFactura);
        $facturaTierra.then(function (datos) {
            $scope.facturaTierra = datos.data;
            $scope.tableFacturaTierra.reload();
        });
        $facturaBebelandia = distribucionService.getStockBebelandia(idFactura);
        $facturaBebelandia.then(function (datos) {
            $scope.facturaBebelandia = datos.data;
            $scope.tableFacturaBebelandia.reload();
        });
        $facturaLibertador = distribucionService.getStockLibertador(idFactura);
        $facturaLibertador.then(function (datos) {
            $scope.facturaLibertador = datos.data;
            $scope.tableFacturaLibertador.reload();
        });
    });
    

    Примечание: если я пишу $rootScope.onего выполнить 3 раза. так $scopeчто просто сделайте один цикл.

    Надеюсь, это кому-то поможет.