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

如何在UI-Router中装饰当前状态解析功能?当前函数未调用

秦伯寅
2023-03-14
问题内容

我正在尝试干燥,$stateProvider并防止auth在每个解析中添加相同的功能。我已经创建了装饰器,该装饰器在每个状态更改时都会将此函数添加到当前状态,但auth不会调用该函数,如何修复它或如何解决所讨论的问题?

app.config(function ($stateProvider, $urlRouterProvider, $provide) {
  $provide.decorator('$state', function($delegate, $rootScope) {
    $rootScope.$on('$stateChangeStart', function(event, state, params) {
      if ($delegate.current === "login" || $delegate.current === "register") {
        return;
      }
      console.log("decorator", $delegate);
      $delegate.current.resolve = {
        auth: ['AuthService', '$stateParams', function(AuthService, $stateParams) {
          //how to invoke this function?
          if (AuthService.isAuthenticated()) {
            return AuthService.me(); //promise
          } else {
            return false;
          }
        }]
      };
    });
    return $delegate;
  });

状态定义:

  $stateProvider.state('root', {
    abstract: true,
    url: '/',
    views: {
      "": {
        controller: 'RootCtrl',
        templateUrl: 'views/root.html'
      },
      "header@root": {
        templateUrl: 'views/header.html'
      }
    }
  })
  .state('root.home', {
    url: urlPrefix,
    views: {
      "content@artworks": {
        templateUrl: 'views/home.html',
        //resolve: {
        //  auth: ['AuthService', '$stateParams', function(AuthService, $stateParams) {
        //  }]
        //}
      }
    }
  })
  ...

问题答案:

如果我正确理解您的要求,我们可以使用本机UI-Router内置的 decorator

[decorator(name, func)](http://angular-ui.github.io/ui-

router/site/#/api/ui.router.state.$stateProvider#methods_decorator)

允许您扩展(谨慎)或重写(自担风险)由$ stateProvider内部使用的stateBuilder对象。这可用于向ui-
router添加自定义功能,例如,基于状态名称推断templateUrl … (请参阅 doc中的更多内容)

有一个工作的家伙

所以,我们可以有这个 var auth

var auth = ['AuthService', '$stateParams',
  function(AuthService, $stateParams) {
    //how to invoke this function on needed states?
    if (AuthService.isAuthenticated()) {
      return AuthService.me();
    } else {
      return false;
    }
  }
];

在这里,我们仅使用带有“ IF”逻辑的装饰器

.config(['$stateProvider', 
  function($stateProvider) {

    $stateProvider.decorator('views', function(state, parent) {
      var result = {},
        views = parent(state);

      // some naive example when to not inject resolve
      if (state.name === "home") { 
        return views;
      }
      // child already has that in parent
      if (state.name.indexOf(".") > 0) { 
        return views;
      }

      angular.forEach(views, function(config, name) {

        // here inject the resolve (if not existing)
        config.resolve = config.resolve || {};
        // and extend it with the auth stuff above
        config.resolve.auth = auth;

        result[name] = config;
      });

      return result;
    });

  }
])

后来我们的几个州,将由上述内容扩展

$stateProvider
    .state('home', {
      url: "/home",
      templateUrl: 'tpl.html',
    })
    .state('parent', {
      url: "/parent",
      templateUrl: 'tpl.html',
      controller: 'SharedCtrl',
    })
    .state('parent.child', {
      url: "/child",
      templateUrl: 'tpl.html',
      controller: 'SharedCtrl',
    });

在这里检查它的作用



 类似资料:
  • 本文向大家介绍angular-ui-router 重新加载当前状态,包括了angular-ui-router 重新加载当前状态的使用技巧和注意事项,需要的朋友参考一下 示例 您可以使用$state.reload控制器中的方法重新加载当前状态 这是的简写(摘自官方文档的代码) 在您的状态上运行重载也会重新启动控制器并重新解析所有已解析的值。

  • 问题内容: 考虑从ui-router文档获取的以下状态: 以及状态“ state1”的“ partials / state1.html”控制器: 是否有任何内置功能可从控制器内部或模板内部确定控制器/模板与哪个状态关联? 例如: 而且,如果没有内置解决方案,您将如何“装饰” $ state或$ stateParams以包含此信息? 我想出的唯一解决方案是使用$ state.get(),然后使用控制

  • 本文向大家介绍angular-ui-router 将数据解析为状态,包括了angular-ui-router 将数据解析为状态的使用技巧和注意事项,需要的朋友参考一下 示例 您可以resolve在转换到状态时将数据转换为状态,通常在状态需要使用该数据或在某些提供的输入需要进行身份验证时解析为状态时非常有用。 定义状态时,您需要提供要解析到.resolve属性中的值的映射,每个解析后的值都应具有一个

  • 问题内容: 在我正在开发的一个有角度的应用程序中,我希望有一个抽象的父状态,该状态必须解析其所有子状态的某些依赖关系。具体来说,我希望所有要求经过身份验证的用户的状态都必须从某些authroot状态继承该依赖项。 我遇到了无法始终解决父依赖关系的问题。理想情况下,我想让父状态检查用户是否仍自动登录到任何子状态。在文档中,它说 子状态将从父状态继承已解析的依赖项,并可以将其覆盖。 我发现仅当我从父级

  • 我正在使用Angular UI路由器,希望重新加载当前状态并刷新所有数据/重新运行当前状态及其父级的控制器。 我有3个州级:directory.organisations.details 目录组织包含一个包含组织列表的表。单击表loads目录中的项目。组织。$StateParams传递项目ID的详细信息。因此,在详细信息状态下,我加载此项目的详细信息,编辑它们,然后保存数据。目前一切正常。 现在我

  • 问题内容: 我正在使用Angular UI Router,并希望重新加载当前状态并刷新所有数据/为当前状态及其父级重新运行控制器。 我有3个状态级别: directory.organisations.details directory.organisations 包含一个带有组织列表的表。单击表中的一个项目将加载$ directoryParams传递该项目的ID的 directory.organi