多个视图,多个解析,但对于 AngularJS 中的一个控制器

Multiple views, multiple resolve but for one controller in AngularJS

我有 2 个视图共享同一个控制器。在这个视图的每一个中,我都使用 resolve 在显示它之前检索一些日期。然后我将它注入我的控制器(所以我为每个视图注入两个依赖项)。

但问题是当我从一个视图转到另一个视图时,控制台显示错误,因为它看不到另一个视图的依赖关系。这是我的路由配置

 .state('ambassade', {
                url: '/mot_ambassadeur',
                views: {
                    "@": {
                        templateUrl: "pages/GestionAmbassade/mot_ambassadeur.html",
                        controller: "GestionAmbassadeController",
                        resolve: {
                            informationsAmbassade: function(GestionAmbassadeService) {
                                return GestionAmbassadeService.getMotAmbassadeurService();
                            }
                        }
                    }
                }
            })
            .state('personnel', {
                url: '/personnel',
                views: {
                    "@": {
                        templateUrl: "pages/GestionAmbassade/personnel.html",
                        controller: "GestionAmbassadeController",
                        resolve: {
                            personnelAmbassade: function(GestionAmbassadeService) {
                                return GestionAmbassadeService.getPersonnelService();
                            }
                        }
                    }
                }
            })

这是我的控制器,2个注入是informationsAmbassade和personnelAmbassade :

 .controller('GestionAmbassadeController', function ($rootScope, $scope, $injector, $sce,
                                                        informationsAmbassade,
                                                        personnelAmbassade) {

        $scope.getMotAmbassadeur = function () {
            if (localStorage.getItem("lang") == "fr") {
                $scope.motAmbassadeur = $sce.trustAsHtml(informationsAmbassade.contents[0].translation.fr_fr.contenu);
                $scope.load = true;
            }
            $scope.photoAmbassadeur = informationsAmbassade.contents[0].content.path;

        };

        $scope.getPersonnel = function () {
            $scope.Personnels = [];
            if (localStorage.getItem("lang") == "fr") {
                for (var i = 0; i < personnelAmbassade.contents.length; i++) {
                    //if ( angular.isDefined(res.contents[i].type) && res.contents[i].type.nom == 'personnel' )
                    $scope.Personnels.push({
                        nom: $sce.trustAsHtml(personnelAmbassade.contents[i].translation.fr_fr.contenu),
                        poste: $sce.trustAsHtml(personnelAmbassade.contents[i].translation.fr_fr.titre)
                    });
                }
                $scope.load = true;
            }
        };

所以当我去 ambassade 路线时,它没有看到 personnalAmbassade 注入,反之亦然。我知道我可以为每个状态使用两个解析,但这是我为了性能目的而避免的。谁能帮我弄清楚这个 "issue".

您应该创建一个顶层抽象状态来解析您的数据,然后确保在您的控制器中加载正确的依赖项(两者)。

.state('app', {
    abstract:true,
    template:'<div ui-view></div>',
    resolve:{
        informationsAmbassade: function(GestionAmbassadeService) {
            return GestionAmbassadeService.getMotAmbassadeurService();
        },
        personnelAmbassade: function(GestionAmbassadeService) {
            return GestionAmbassadeService.getPersonnelService();
        }
    }
}
.state('app.ambassade', {
    url: '/mot_ambassadeur',
    views: {
        "@": {
            templateUrl: "pages/GestionAmbassade/mot_ambassadeur.html",
            controller: "GestionAmbassadeController"
            }
        }
    }
})
.state('app.personnel', {
    url: '/personnel',
    views: {
        "@": {
            templateUrl: "pages/GestionAmbassade/personnel.html",
            controller: "GestionAmbassadeController"
        }
    }
})

您应该将控制器中的注入视为来自更多面向对象语言的接口。

所以将它命名为类似 entityService 的名称,这样您尝试注入的两个服务都有一个可以从控制器调用的同名方法。 (或者在你的情况下 'contents' 数组)

.controller('GestionAmbassadeController', function ($rootScope, $scope, $injector, $sce,entityService) {

然后在解析中输入:

entityService: return GestionAmbassadeService.getPersonnelService();

entityService:  return GestionAmbassadeService.getMotAmbassadeurService();

取决于控制器实例。

编辑:在这种情况下,为两个状态使用相同的控制器似乎不是一个好主意。无论如何,您将只能使用两个定义的作用域函数之一。所以最好有单独的控制器。

谢谢你们。这两个答案都解决了问题(我试过了:D)。但我认为第一个更合适,因为在第二个中,当我有太多页面用于同一个控制器时,它会比第一个答案慢一点。

但两者仍然有效。谢谢。

编辑:当我说第一个我在谈论 Bob Brinks 时回答了。当他编辑它时它向下移动。