Angularjs &引用;同步“;在页面中加载组件

Angularjs &引用;同步“;在页面中加载组件,angularjs,ionic-framework,Angularjs,Ionic Framework,我有一个Ionic 1.3移动应用程序,其中我使用Angular 1.5。每个页面由一个或多个角度组件组成,这些组件中的每一个又可能包含其他组件,从而在页面中创建组件树 我遇到的问题是,其中一些组件可能需要来自服务器的数据,这些数据加载在组件的$onInit函数中。由于这些数据是异步检索的(可能会有延迟),结果是组件在页面中一个接一个地出现(取决于每个组件的初始化时间),这不利于提供非常“本地”的移动体验。我想做的是找到一种方法来知道所有组件何时完成加载,以便只有在页面真正准备就绪(所有组件都已

我有一个Ionic 1.3移动应用程序,其中我使用Angular 1.5。每个页面由一个或多个角度组件组成,这些组件中的每一个又可能包含其他组件,从而在页面中创建组件树

我遇到的问题是,其中一些组件可能需要来自服务器的数据,这些数据加载在组件的$onInit函数中。由于这些数据是异步检索的(可能会有延迟),结果是组件在页面中一个接一个地出现(取决于每个组件的初始化时间),这不利于提供非常“本地”的移动体验。我想做的是找到一种方法来知道所有组件何时完成加载,以便只有在页面真正准备就绪(所有组件都已完全呈现)后才能显示页面

我最初的想法是在控制器初始化时向每个组件“注册”一个服务,然后在加载数据后通知服务该组件已准备就绪。然后,服务可以负责在所有组件就绪时显示页面。我这样做的问题是组件似乎是按顺序初始化的(即组件1的控制器初始化,然后执行$onInit,然后组件2的控制器初始化,然后执行$onInit,等等),这意味着我的服务无法真正知道它正在等待多少组件。不仅如此,组件的子控制器也会初始化,并且它们的$onInit方法会在父组件完成初始化后执行,这意味着组件也无法跟踪其子控制器是否已初始化

另一种方法是对页面中某个位置的组件数量进行硬编码,并通过页面控制器将其传递给服务,以便它知道需要等待多少个组件,而无需组件进行自我注册,但理想情况下,我希望有更易于维护的组件(也就是说,不需要我自己跟踪组件和更新此数字)


有人能想出其他方法来跟踪我的页面何时可以使用Angular2或Ionic?理想情况下,它也可以移植到Angular2/Ionic2,因为我希望应用程序在某个时候升级,但欢迎任何建议。

您可以尝试在ui.router或ngRoute中使用resolve:

angular.module('app', ['ui.router'])
    .config(['$stateProvider', function($stateProvider)     { 
    $stateProvider.state('mainstate', {
         url: 'your-url'
         ,templateUrl: 'yout_template.html'
         ,controller: 'YourController'
         ,resolve: {
              yourFirstData: ['serviceDeps', function(serviceDeps){ 
                    return serviceDeps.getFirstData();
              }]
              ,yourSecondData: ['serviceDeps', 'yourFistData', function(serviceDeps, yourSecondData){ 
                    return serviceDeps.getSecondData(yourFirstData); 
              }
         }
    }
}]);
解析将在加载控制器之前获取数据并解析承诺


这是一个想法。

您可以尝试在ui.router或ngRoute中使用resolve:

angular.module('app', ['ui.router'])
    .config(['$stateProvider', function($stateProvider)     { 
    $stateProvider.state('mainstate', {
         url: 'your-url'
         ,templateUrl: 'yout_template.html'
         ,controller: 'YourController'
         ,resolve: {
              yourFirstData: ['serviceDeps', function(serviceDeps){ 
                    return serviceDeps.getFirstData();
              }]
              ,yourSecondData: ['serviceDeps', 'yourFistData', function(serviceDeps, yourSecondData){ 
                    return serviceDeps.getSecondData(yourFirstData); 
              }
         }
    }
}]);
解析将在加载控制器之前获取数据并解析承诺


这是一个想法。

感谢您的建议,但在我的情况下,这将不起作用,因为应用程序的构建方式是在构建时将组件添加到页面中(通过一些配置逻辑)因此,无法确切地知道每个页面将放置哪些组件,以便在UI路由器解析中说明它们的数据。感谢您的建议,但是在我的情况下,这将不起作用,因为应用程序的构建方式是在构建时将组件添加到页面中(通过一些配置逻辑)因此,没有办法确切地知道每个页面将放置哪些组件,以便在UI路由器的解析中说明它们的数据。