Javascript 使用服务在控制器之间共享对象

Javascript 使用服务在控制器之间共享对象,javascript,angularjs,Javascript,Angularjs,我必须控制第一个控制器是“cockpitController”,另一个是“idCardSupplierWarnController”。在第一个控制器中,我设置了我的对象,并检查了设置是否有效,我可以看到我的所有对象,但当我想在另一个控制器中获取我的对象时,我的所有对象都为空 PS:我检查了此解决方案,它适用于控制器位于导航器的同一窗口中的情况,但在我的情况下,它位于使用$Window.open(url)的新窗口中 Le服务idCardSupplierWarnService: var app =

我必须控制第一个控制器是“cockpitController”,另一个是“idCardSupplierWarnController”。在第一个控制器中,我设置了我的对象,并检查了设置是否有效,我可以看到我的所有对象,但当我想在另一个控制器中获取我的对象时,我的所有对象都为空

PS:我检查了此解决方案,它适用于控制器位于导航器的同一窗口中的情况,但在我的情况下,它位于使用
$Window.open(url)
的新窗口中

Le服务idCardSupplierWarnService

var app = angular.module('idCardSupplierWarn');

app.service('idCardSupplierWarnService', function () {

    this.idRefNum = "";
    this.idSupNum = "";
    this.codeSuppNum = "";

    this.setParam = function (paramSet) {

        console.log(paramSet);

        this.idRefNum = paramSet.designRefPart;
        this.idSupNum = paramSet.idSuppNumber;
        this.codeSuppNum = paramSet.codeSupp;

    };

    this.getParamSupNum = function () {

        return this.idSupNum;

    };

    this.getParamCodeSupNum = function () {

        return this.codeSuppNum;

    };

    this.getParamIdRefNum = function () {

        return this.idRefNum;

    };


});
    (function () {
        angular
            .module("cockpit", ['mm.foundation', 'security', 'message', "isteven-multi-select"])
            .controller('cockpitController', ['$scope', '$translate', 'serviceCockpit','idCardSupplierWarnService', '$window', function ($scope, $translate, serviceCockpit,idCardSupplierWarnService,$window) {

                var urlSuppliersWarning = 'rest/suppliers/warnings';
                var urlSuppliersWarningByRefForDetails = 'rest/suppliers/warnings/supplier/ref/search';


                var self = this;

                serviceCockpit.loadData([urlSuppliersWarning]).then(function (results) {
                    self.suppliersWarning = results[0].data;
                });

                this.change = function () {

                    if (this.openWindow) {
                        this.openWindow = false;
                    }
                    else {
                        this.openWindow = true;
                    }

                };


                $scope.openNewWindowRef = function (url, params) {
                    console.log(params);
                    idCardSupplierWarnService.setParam(params);
                    console.log(idCardSupplierWarnService.getParams());
                    $window.open(url, '_blank', 'left=0, top=0, width=1100,height=600,scrollbars=yes, resizable=1');
                };

                $scope.openNewWindowSupp = function (url, params) {
                    idCardSupplierWarnService.setParam(params);
                    console.log(idCardSupplierWarnService);
                    $window.open(url, '_blank', 'left=0, top=0, width=1100,height=600,scrollbars=yes, resizable=1');
                };

                this.process = function (items) {

                    if (items.origin == 'reference' || items.origin == 'suppliers' || items.origin == 'supplierAccounts' || items.origin == 'supplierAddressCodes' || items.origin == 'reset') {

                        serviceCockpit.loadData([urlSuppliersWarningByRefForDetails], items).then(function (results) {
                            self.suppliersWarningDetails = results[0].data;
                        });
                    }

                    serviceCockpit.loadData([urlSuppliersWarning], items).then(function (results) {
                        self.suppliersWarning = results[0].data;
                    });
                }

            }]);
    })();
Le控制器龙头控制器

var app = angular.module('idCardSupplierWarn');

app.service('idCardSupplierWarnService', function () {

    this.idRefNum = "";
    this.idSupNum = "";
    this.codeSuppNum = "";

    this.setParam = function (paramSet) {

        console.log(paramSet);

        this.idRefNum = paramSet.designRefPart;
        this.idSupNum = paramSet.idSuppNumber;
        this.codeSuppNum = paramSet.codeSupp;

    };

    this.getParamSupNum = function () {

        return this.idSupNum;

    };

    this.getParamCodeSupNum = function () {

        return this.codeSuppNum;

    };

    this.getParamIdRefNum = function () {

        return this.idRefNum;

    };


});
    (function () {
        angular
            .module("cockpit", ['mm.foundation', 'security', 'message', "isteven-multi-select"])
            .controller('cockpitController', ['$scope', '$translate', 'serviceCockpit','idCardSupplierWarnService', '$window', function ($scope, $translate, serviceCockpit,idCardSupplierWarnService,$window) {

                var urlSuppliersWarning = 'rest/suppliers/warnings';
                var urlSuppliersWarningByRefForDetails = 'rest/suppliers/warnings/supplier/ref/search';


                var self = this;

                serviceCockpit.loadData([urlSuppliersWarning]).then(function (results) {
                    self.suppliersWarning = results[0].data;
                });

                this.change = function () {

                    if (this.openWindow) {
                        this.openWindow = false;
                    }
                    else {
                        this.openWindow = true;
                    }

                };


                $scope.openNewWindowRef = function (url, params) {
                    console.log(params);
                    idCardSupplierWarnService.setParam(params);
                    console.log(idCardSupplierWarnService.getParams());
                    $window.open(url, '_blank', 'left=0, top=0, width=1100,height=600,scrollbars=yes, resizable=1');
                };

                $scope.openNewWindowSupp = function (url, params) {
                    idCardSupplierWarnService.setParam(params);
                    console.log(idCardSupplierWarnService);
                    $window.open(url, '_blank', 'left=0, top=0, width=1100,height=600,scrollbars=yes, resizable=1');
                };

                this.process = function (items) {

                    if (items.origin == 'reference' || items.origin == 'suppliers' || items.origin == 'supplierAccounts' || items.origin == 'supplierAddressCodes' || items.origin == 'reset') {

                        serviceCockpit.loadData([urlSuppliersWarningByRefForDetails], items).then(function (results) {
                            self.suppliersWarningDetails = results[0].data;
                        });
                    }

                    serviceCockpit.loadData([urlSuppliersWarning], items).then(function (results) {
                        self.suppliersWarning = results[0].data;
                    });
                }

            }]);
    })();
Le控制器**idCardSupplierWarnController:**

 (function () {
    angular
        .module("idCardSupplierWarn", ['mm.foundation', 'security', 'message', "isteven-multi-select"])
        .controller('idCardSupplierWarnController', ['$translate', '$scope', 'serviceCockpit','idCardSupplierWarnService', function ($translate, $scope, serviceCockpit,idCardSupplierWarnService) {


            var urlSupplierWarningByRefDetail = 'rest/suppliers/warnings/supplier/details';

            var self = this;


             var params = {} ;

             params.idRefNum = idCardSupplierWarnService.getParamIdRefNum();
             params.idSupNum = idCardSupplierWarnService.getParamSupNum();
             params.codeSuppNum = idCardSupplierWarnService.getParamCodeSupNum();
                      console.log(params.codeSuppNum);


            serviceCockpit.loadData([urlSupplierWarningByRefDetail], params).then(function (results) {
                self.suppliersWarningsList = results[0].data;
            });


        }]);
})();
服务功能中的“此”指的是服务中的单个功能,而不是服务本身

将您的服务修改为如下所示:

app.service('idCardSupplierWarnService', function () {

    var service = this
    service.idRefNum = "";
    service.idSupNum = "";
    service.codeSuppNum = "";

    service.setParam = function (paramSet) {

        console.log(paramSet);

        service.idRefNum = paramSet.designRefPart;
        service.idSupNum = paramSet.idSuppNumber;
        service.codeSuppNum = paramSet.codeSupp;

    };

    service.getParamSupNum = function () {

        return service.idSupNum;

    };

    service.getParamCodeSupNum = function () {

        return service.codeSuppNum;

    };

    service.getParamIdRefNum = function () {

        service this.idRefNum;

    };

    return service

});

您需要将
idCardSupplierWarn
模块插入
驾驶舱
模块,才能访问
服务

angular.module("cockpit", ['mm.foundation', 'security', 'message', `isteven-multi-select`, `idCardSupplierWarn`])

首先,请用英语保存。接下来,使用工厂在控制器之间共享数据。您错过了服务的正确行为。您可以像工厂一样使用服务。你要找的是一个工厂。当我在cockpitController中设置参数时,它会工作,但当我在idCardSupplierWarnController中调用服务时,我的所有对象都为空。这可能是一个执行顺序问题。由于URL是硬编码的,并且您希望数据始终可用,我建议在服务的构造器中检索它。你能给我一些例子吗change@YasBES:浏览器控制台中有错误吗?只有我可以设置的第一个控制器没有错误,当我检查get方法时,它工作正常,但当我尝试在另一个控制器中获取对象时控制器idCardSupplierWarnController我什么也没有得到(空对象)@YasBES:在将
idCardSupplierWarn
模块的依赖性添加到
caffick
模块后,您能否确认
setParam()
服务方法在
getparam…()
方法之前被调用?是的,我测试了getparam在第一个控制器CockpitController中,它工作正常,但当我在另一个控制器中调用相同的方法时,它不工作