AngularJs UI-Router - 页面刷新 $state.current 现在为空为空、页面、现在、UI

2023-09-06 08:36:37 作者:Smile、凉城

我有一个使用 ui-routerAngular 应用程序,每次刷新页面时都会遇到问题.我正在使用嵌套视图、命名视图来构建应用程序.每当我刷新页面时, ui-router 都不会重新加载当前状态,只会将页面留空.

I have an Angular application using ui-router and I am having issues whenever I refresh the page. I am using nested views, named views to build the application. Whenever I refresh the page, ui-router doesn't reload the current state and just leaves the page blank.

页面加载 $state.current 等于

Object {name: "", url: "^", views: null, abstract: true}

我正在通过 $http.json 文件中读取我的导航,并在状态中循环.所以这就是我可以展示的:

I am reading my navigation from a .json file via $http and looping through the states. So this is what I can show:

stateProvider.state(navElement.stateName, {
    url: navElement.regexUrl ? navElement.regexUrl : url,
    searchPage: navElement.searchPage,   //something custom i added
    parent: navElement.parent ? navElement.parent : "",
    redirectTo: navElement.redirectTo,
    views: {
        'subNav@index': {
            templateUrl: defaults.secondaryNavigation,
            controller: 'secondaryNavigationController as ctrl' //static
        },
        'pageContent@index': {
            template: navElement.templateUrl == null 
                                              ? '<div class="emptyContent"></div>' 
                                              : undefined,
            templateUrl: navElement.templateUrl == null 
                                              ? undefined 
                                              : navElement.templateUrl,
            controller: navElement.controller == null 
                                              ? undefined 
                                              : navElement.controller + ' as ctrl'
        }
    }
});

此代码针对嵌套 json 对象中的每个项目执行.如果还有什么有用的,请告诉我.

This code gets executed for each item in the nested json object. If there is anything else that would be helpful, let me know.

推荐答案

有个问题:AngularJS - UI-router - How to用一个答案配置动态视图,它显示了如何做到这一点.

There is a question: AngularJS - UI-router - How to configure dynamic views with one answer, which shows how to do that.

发生了什么?刷新时,url 被更快地评估,然后状态被注册.我们必须推迟那个.解决方案由 UI-Router 原生特性 deferIntercept(defer)

What is happening? On refresh, the url is evaluated sooner, then states are registered. We have to postpone that. And solution is driven by UI-Router native feature deferIntercept(defer)

$urlRouterProvider.deferIntercept(推迟)

如文档中所述:

$urlRouterProvider.deferIntercept(defer)

AngularJS如何实现表单向导的功能

As stated in the doc:

禁用(或启用)延迟位置更改拦截.

Disables (or enables) deferring location change interception.

如果您希望自定义同步 URL 的行为(例如,如果您希望推迟转换但保留当前 URL),请在配置时调用此方法.然后,在运行时,在您配置好自己的 $locationChangeSuccess 事件处理程序后调用 $urlRouter.listen().

If you wish to customize the behavior of syncing the URL (for example, if you wish to defer a transition but maintain the current URL), call this method at configuration time. Then, at run time, call $urlRouter.listen() after you have configured your own $locationChangeSuccess event handler.

简而言之,我们将在配置阶段停止 URL 处理:

In a nutshell, we will stop URL handling in config phase:

app.config(function ($urlRouterProvider) {
 
  // Prevent $urlRouter from automatically intercepting URL changes;
  // this allows you to configure custom behavior in between
  // location changes and route synchronization:
  $urlRouterProvider.deferIntercept();
 
})

一旦我们从 JSON 配置了所有动态状态,我们将在 .run() 阶段重新启用它:

And we will re-enable that in .run() phase, once we configured all dynamic states from JSON:

.run(function ($rootScope, $urlRouter, UserService) {
 
  ...

    // Once the user has logged in, sync the current URL
    // to the router:
     $urlRouter.sync();
 
    // Configures $urlRouter's listener *after* your custom listener
    $urlRouter.listen();
});

链接中的 plunker/stackoverflow.com/a/29013914/1679310">问答一个

There is a plunker from the linked Q & A