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,但我似乎不能等