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

如何使用Angular UI Router设置默认子视图

阴鸿才
2023-03-14
问题内容

假设我有以下3个Angular UI Router状态:

$stateProvider
    .state('adminCompanies', {
        abstract: true,
        url: "/admin/companies",
        template: '<div ui-view class="viewContainer" autoscroll="false" />'
    })
    .state('adminCompanies.list', {
        url: "",
        templateUrl: 'app/admin/companies/companies.list.html',
        controller: 'AdminCompaniesController'
    })
    .state('adminCompanies.detail', {
        url: "/:companyId",
        templateUrl: 'app/admin/companies/companies.detail.html',
        resolve: {
            company: function(Model, $stateParams) {
                return Model.get("/admin/companies", $stateParams.companyId);
            }
        },
        controller: 'AdminCompanyDetailController'
    })

如果adminCompanies直接转换为,我该如何告诉Angular UI Router进入adminCompanies.list状态?

理想情况下,我想要的是这样的:

$stateProvider.when('adminCompanies', 'adminCompanies.list');

然后,在我的代码中,我希望$ state.go(’adminCompanies’)等同于$ state.go(’adminCompanies.list’)


问题答案:

由于您的应用程序当前已设置,因此您不需要任何明确的html" target="_blank">逻辑。当子状态具有空url属性时,它在其父状态变为活动的同时变为活动状态。子状态的任何模板都将插入到ui- view父状态的模板提供的指令中。Angular UI 示例应用程序解决了这种类型的体系结构:当contacts状态被导航到时,其模板提供了导航布局以及ui- view其子状态的区别;因为contacts.list状态的url属性为"",所以在contacts导航到其父状态时会自动加载该状态。这记录在应用程序的注释中:

使用空URL表示此子状态在导航到其父URL时将变为活动状态。子状态的网址会自动附加到其父目录的网址中。因此,此状态的url为’/
contacts’(因为’/ contacts’+”)。

现在,假设出于某种原因,您 从未 希望您的父adminCompanies国家成为活跃国家。在这种情况下,您可以使该状态成为
抽象
状态,如下所示:

$stateProvider
    .state('adminCompanies', {
        abstract: true,
        url: "/admin/companies",
        template: '<div ui-view class="viewContainer" autoscroll="false" />'
    })
    .state('adminCompanies.list', {
        url: "/list",
        templateUrl: 'app/admin/companies/companies.list.html',
        controller: 'AdminCompaniesController'
    })
    .state('adminCompanies.detail', {
        url: "/:companyId",
        templateUrl: 'app/admin/companies/companies.detail.html',
        resolve: {
            company: function(Model, $stateParams) {
                return Model.get("/admin/companies", $stateParams.companyId);
            }
        },
        controller: 'AdminCompanyDetailController'
    })

请注意abstract: true第三行的加法和/listfor 的显式状态urladminCompanies.list

这告诉Angular-
UI,应该出于URL导航的目的将这种状态视为不存在。但是,当您导航到子状态时,它将仍然处于活动状态,因此它仍将使用您提供的URL为子状态的URL加上前缀。但是,如果您尝试从其他状态导航至该状态,则该状态就好像该状态不存在一样。因此,您还需要使用来添加对不匹配网址的处理$urlRouteProvider

基本的使用$urlRouteProvider可能如下所示:

$urlRouterProvider.otherwise("/")

这只是将对不存在状态的所有调用重定向到URL为“
/”的状态。假设您有一个。但是,由于有人可能试图导航到列表视图,但又/admin/companies直接导航到列表视图,因此您可能应该具有以下处理程序:

$urlRouterProvider.when("/admin/companies", "/admin/companies/list");

您使用哪一种取决于您的应用程序的体系结构,但似乎对于您当前的需求,您无需执行任何操作。如果您的规范发生更改,则抽象状态可能会派上用场。



 类似资料:
  • 接口说明 设置场景默认视角 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/viewpoint/1.0.0/setSceneDefault 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 dId string form 是 场景ID directionx number form 是 相机位置,从cam

  • 问题内容: 我想仅使用CSS为标准window.confirm设置样式,而不使用任何其他JavaScript代码。可能吗 如果是的话,我该怎么办? 问题答案: 这不可能。浏览器使用平台的UI套件显示此窗口。它不在DOM中,在CSS或Javascript中也不可见,您无能为力。 但是,一些非常简单的jQuery代码可以解决问题。怎么样

  • 我已经安装了nvm(ubuntu with zsh shell),有两个节点版本:V6.11.5和V9.0.0,并且nvm的默认版本是V9.0.0 每次需要更改节点版本时 我如何更改nvm版本默认值以定义V6.11.5?

  • 问题内容: 我已经安装了具有两个节点版本的nvm(带有zsh shell的ubuntu):v6.11.5和v9.0.0,nvm中的默认版本为v9.0.0。 每次我需要更改节点版本时 如何更改nvm版本的默认值以定义v6.11.5? 问题答案: (此处为nvm维护者) 如果您希望将其固定到该特定版本。 您也可以。 无论哪种方式,您都需要升级到最新版本的(截至撰写本文时,v0.33.11)

  • 我的数据有一个ATOM-XML表示,通过Spring MVC web服务返回。我使用JAXB进行序列化,我有许多名称空间,但我希望默认名称空间设置为Atom,不带前缀。下面是我到目前为止在中的内容,但是atom前缀被设置为NS3。 另外,我注意到chrome中显示的名称空间,而Firefox中没有。

  • 问题内容: 我的UIPickerView有问题。我在欧盟AP和NA中有3个值。当我启动该应用程序时,似乎选择了EU,但是当我做出选择时,我只会返回,现在当我触摸UIPickerView时,EU值被选中,然后从NSLog中返回。 我的问题是: 当用户仅启动应用程序并且什么都不触摸时,如何定义默认值(不仅是标签),该值将被选中。 编辑: 这是我的代码来获取所选项目: 问题答案: TL:DR版本: 您没