当前位置: 首页 > 面试题库 >

在ui路由器解析期间应用加载微调器

皇甫波峻
2023-03-14
问题内容

resolve属性的$routeProvider允许在呈现相应视图之前执行一些作业。

如果我想在执行这些作业时显示微调框以增加用户体验怎么办?
确实,否则,用户会感觉到应用程序已被阻止,因为例如在大于600的毫秒内没有显示任何视图元素。

当然,由于该功能,因此可以 从当前视图中定义* 要显示的全局div元素,以便显示微调器。
但是我不想只在中间放置一个糟糕的微调器来隐藏整个页面。 我希望Webapp的某些页面在显示加载方式方面有所不同。

$scope.$rootChangeStart
***

我碰到了一个有趣的帖子,其中包含我上面所述的确切问题:

这种方法导致可怕的UI体验。用户单击按钮以刷新列表或其他内容,并且整个屏幕都覆盖在通用微调器中,因为库无法仅针对实际上受状态更改影响的视图显示微调器。不用了,谢谢。

无论如何,在提出此问题之后,我意识到“解决”功能是一种反模式。它等待所有承诺解决,然后为状态更改添加动画效果。这是完全错误的-
您希望状态之间的过渡动​​画与数据加载并行运行,以便后者可以被前者掩盖。

例如,假设您有一个项目列表,然后单击其中的一个将隐藏该列表,并在其他视图中显示该项目的详细信息。如果我们对项目详细信息的异步​​加载平均需要400毫秒,那么在大多数情况下,我们可以通过在列表视图上放置300毫秒的“离开”动画和300毫秒的“输入”动画来几乎完全覆盖负载在项目详细信息视图上。这样,我们为UI提供了一种流畅的感觉,并且在大多数情况下可以完全避免显示微调器。

但是,这要求我们同时启动异步加载和状态更改动画。如果使用“解决”,则整个异步动画都会在动画开始之前发生。用户单击,看到一个微调器,然后看到过渡动画。整个状态更改将花费〜1000ms,这太慢了。

如果可以选择不等待promise,“
resolve”可能是一种缓存不同视图之间的依赖关系的有用方法,但是当前的行为(总是在状态更改开始之前对其进行解决)使其几乎无用,IMO。对于涉及异步负载的任何依赖关系,都应避免使用。

我是否应该真正停止使用resolve加载一些数据,而是直接将它们直接加载到相应的控制器中?这样我就可以更新相应的视图,只要该作业已执行且在视图中所需的位置即可,而不是全局。


问题答案:

您可以使用侦听指令,$routeChangeStart例如在触发时显示该元素:

app.directive('showDuringResolve', function($rootScope) {

  return {
    link: function(scope, element) {

      element.addClass('ng-hide');

      var unregister = $rootScope.$on('$routeChangeStart', function() {
        element.removeClass('ng-hide');
      });

      scope.$on('$destroy', unregister);
    }
  };
});

然后,将其放置在特定视图的加载器上,例如:

查看1:

<div show-during-resolve class="alert alert-info">
  <strong>Loading.</strong>
  Please hold.
</div>

查看2:

<span show-during-resolve class="glyphicon glyphicon-refresh"></span>

此解决方案(以及与此相关的许多其他解决方案)的问题在于,如果您从外部站点浏览到其中一个路由,则不会加载以前的ng-
view模板,因此您的页面在解析期间可能只是空白。

这可以通过创建将用作后备加载器的指令来解决。$routeChangeStart仅当没有先前的路由时,它才会侦听并显示加载程序。

一个基本的例子:

app.directive('resolveLoader', function($rootScope, $timeout) {

  return {
    restrict: 'E',
    replace: true,
    template: '<div class="alert alert-success ng-hide"><strong>Welcome!</strong> Content is loading, please hold.</div>',
    link: function(scope, element) {

      $rootScope.$on('$routeChangeStart', function(event, currentRoute, previousRoute) {
        if (previousRoute) return;

        $timeout(function() {
          element.removeClass('ng-hide');
        });
      });

      $rootScope.$on('$routeChangeSuccess', function() {
        element.addClass('ng-hide');
      });
    }
  };
});

备用加载程序将通过ng-view放置在元素外部:

<body>
  <resolve-loader></resolve-loader>
  <div ng-view class="fadein"></div>
</body>

全部演示: http :
//plnkr.co/edit/7clxvUtuDBKfNmUJdbL3?p=preview



 类似资料:
  • 问题内容: 我从一个演示程序离子(开始),并添加一个到一个视图: 我在这里监视被拒绝的s: 由于某种原因,如果立即拒绝(请参见上文),则不会运行的回调。如果我做的完全一样,但是在Ionic之外,那行得通! 而且,尝试通过这样做来延迟拒绝会导致不同的行为。现在,它可以按预期在浏览器中运行,但仍无法在设备上运行。尝试进一步延迟,将导致设备成功: 谁能阐明这一点? 问题答案: 根据我对Angular和P

  • 最终编辑:使用transcluded指令处理plunker。 编辑:我用第一个答案中给出的解决方案做了第一次撞击。它可以工作,但这不是期望的行为,因为模板包含所有的部分内容。 我用我希望达到的目标做了第二次尝试(但显然不起作用)。我认为这主要是因为模板不是分部的父级,但它包含在其中,所以ui路由器不太理解我想要什么。 在此方面的任何帮助都将不胜感激! 我们正在建立一个网站与角材料和UI路由器,我们

  • 我有AngularJs ui路由器在我的应用程序。我需要加载js文件基于我的状态。 当主控状态加载时,headerController、homeController和footerController具有不同的js文件。我们需要加载控制器js文件。是否可以通过UI路由器?

  • 我有一个带有路由器插座的根应用程序组件,并且路由是从家庭模块路由加载的,该路由在其子路由中使用延迟加载和 loadchildren。家庭组件中有一个路由器插座,在家庭的所有子模块中也有延迟加载的路由器插座。路由工作正常,但子路由也加载到根路由器出口中。例如:- 组件“testCreateComponent”正在加载localhost:4200 / test/create和localhost:420

  • 问题内容: 我有一个React应用,可以调用我的API,该API返回URL列表以用作imy图像src。 我用来显示图像加载时的加载微调组件。 我有一个变量来确定图像是否正在加载。 我无法弄清楚如何停止显示正在加载的微调器,并在它们全部加载后显示图像。 这是我的代码: Photos.jsx Photo.jsx 我尝试将我的最后一项用于,但是它永远不会被调用,因为由于仍然显示了微调框,所以它从未设置为

  • 我希望使用相同的路由路径,根据用户角色为我的用户加载稍微不同的视图。 以前,我已经加载了基于当前域的不同路由: 这种方法只依赖于子域,子域在创建时可用,因此所有内容都可以是同步的。我必须对用户进行身份验证,根据其角色加载正确的路由,然后导出路由器以初始化vue应用程序。 理想情况下,我可以加载基于用户角色的,,,其中可以包含角色的所有路由定义。 我正在使用Feathers-vuex,但我似乎不能等