当前位置: 首页 > 知识库问答 >
问题:

最优化的方式加载数据显示在路由器的控制器上

焦兴为
2023-03-14

我需要构建一个用户,该用户可以是不同RESTAPI调用的结果(每种方式都来自特定的路由)。

假设我们可以访问以下示例:

> 超文本传输协议

  • 超文本传输协议://myapp/#user/:user_id

    angular.module('Test').config(['$routeProvider',
        function($routeProvider) {
            $routeProvider.
                when('/user/:pseudo', {
                    templateUrl: 'views/user.html',
                    controller: 'userFromPseudoCtrl'
                }).
                when('/user/:user_id', {
                    templateUrl: 'views/user.html',
                    controller: 'userFromIdCtrl'
                }).
                otherwise({
                    redirectTo: '/'
                });
        }
    ]);

    然后,我有3个不同的控制器:

    >

  • userfromposeudoctrl
  • userFromIdCtrl
  • userCtrl(控制视图)

    angular.module('Test').controller('userFromPseudoCtrl', function($User, $http) {
        $http.get('/getUserFromPseudo/test')
        .success(function(User) {
             $User.set(User);
        });
    });
    
    angular.module('Test').controller('userFromIdCtrl', function($User, $http) {
        $http.get('/getUserFromId/test')
        .success(function(User) {
             $User.set(User);
        });
    });
    
    angular.module('Test').controller('userCtrl', function($scope, $User) {
        $scope.User = $User;
    });

    这种方式是不好的,因为userCtrl是在$超文本传输协议回调(从路由器的控制器)之前调用的,所以User实际上是空的(我跳它会自动更新)。

    在我尝试使用它(使用$rootScope.$apply())进行管理之前,我想知道做这种处理(从路由器控制器加载数据然后显示数据)的更优化的方法是什么。

    你用的控制器和我一样多吗?您是否在“绑定”视图的同一个控制器中处理这些REST API调用?我是有趣的知道!

  • 共有1个答案

    桂和同
    2023-03-14

    定义路由时,您可以定义一个名为resolve的附加值,该值是一个对象,其中每个字段都promise在解析后将注入控制器:

    路线定义:

    when('/user/:pseudo', {
        templateUrl: 'views/user.html',
        controller: 'userFromPseudoCtrl'
        resolve: {dataNeeded: userPseudoService.getUserData()});
    

    服务(新):

    angular.module('Test').service('userPseudoService', function($http){
        return $http.get('/getUserFromPseudo/test');
    });
    

    控制器:

    angular.module('Test').controller('userFromPseudoCtrl', function(dataNeeded){});
    

    在promise解决之前,路线不会改变。

     类似资料:
    • 问题内容: 是否可以基于路由组动态加载控制器,js文件和模板?伪代码不起作用: 我已经看到了很多这样的问题,但是没有一个问题基于路由组加载js文件/控制器。 问题答案: 我设法解决了受@ calebboyd,http : //ify.io/lazy-loading-in-angularjs/ 和http://weblogs.asp.net/dwahlin/archive/2013/05/22/dy

    • 问题内容: 您好朋友,我想在特定的div加载数据之前向Ajax加载器显示,但问题是数据在同一页面上动态传输,但是我的脚本从另一个文件调用数据, 请参见下面的代码 脚本 的HTML 它的工作正常,但我想在同一页面中加载数据,请帮助我 提前致谢 .... 编辑 我想说明之前加载数据装载到 问题答案: 您可以尝试使用以下html- 和脚本-

    • 问题内容: 我试图在UI-Router router.js文件中延迟加载控制器和模板,但是在模板处理上遇到困难。 控制器已正确加载,但是在加载之后,我们必须加载模板,这就是问题所在。 ocLazyLoad加载控制器后,我们解析了一个Angular Promise,它也包含在templateProvider中。问题在于,在文件加载完成后,不是返回诺言(templateDeferred.promise

    • 我是新手所以我可能错过了什么

    • 问题内容: 我对何时实例化控制器感到困惑。另外,嵌套状态时如何实例化控制器。我可能会感到困惑,如何将范围附加到视图和控制器,也就是说,如果每个视图都有自己的控制器和范围,或者它们共享相同的范围。 有人可以解释何时实例化控制器吗?在嵌套路由下,所有视图是否共享一个控制器和范围?当我切换状态并返回另一个控制器实例化的状态时会发生什么? 以下是我的路线(配置文件): 问题答案: 要获得更详细的答案,我们

    • 我使用React路由器的SPA,但我不确定如何显示索引路由"/"上的一些内容。 我的顶级路由器配置只是: 顶层组件呈现页眉/页脚和其他公共元素: 子路由工作正常,它们在应用程序组件中呈现。但是,如何在根路径上呈现某些内容,使其不只是一个空白页面?