javascript - 使用 Angular UI Router,如何使一个状态成为所有状态的子状态?

标签 javascript angularjs modal-dialog angular-ui-router

我想让模式对话框在 Angular UI Router 中成为一个单独的状态。但是,我有一种情况,模式框可以/应该出现在所有状态的顶部......我不确定这是否可能。

例如,假设我有 /store/admin 作为 2 个独立的顶级状态。现在假设我有一个不相关的模态对话框,例如应该位于每个对话框之上的联系表单(仅作为示例)。

如果我将其建模为 /contact/store/admin 状态显然会被遗忘,因此模态背后的背景是空白。

解决方案可能是有两个子状态,如 /store/contact/admin/contact,这样可以保留模式对话框后面的内容。 . 然而,这种方法无法扩展到 X 数量的顶级状态。

简而言之,我怎么能说 /contact 是所有状态的 child ,而不管嵌套?这可能吗?还是在这种情况下我不必使用 Angular UI 路由器?

最佳答案

UI-Router 状态机用父子 关系表示。所以答案是 - 每个 child 只能/恰好有一个 parent 。这是事实。它可以被视为“某种无效的答案”

但是,如果我们真的想要有很多子状态 /contact (其中 contact 特性被移动到它自己的状态),我不会说重复定义是一个问题。

它可以被标记为开销,但状态只是一个配置。它不会对性能产生太大影响。 viewscontrollers 无论如何都是按状态实例化的……不管它的状态定义如何。

// declare once view
var contactState = {
  controller: ...
  template: ...
  ...
};

// reuse as need for some ...
stateNamesWithContact.forEach( function(stateName)
{
    // regiester state many times as "some.parnet.child.contact"
    $stateProvider
        .state(stateName + ".contact", contact);
    ...

我更喜欢的另一种方法是使用Contact 作为子状态。将其移动到 View 中(哪些功能将支持模式)

Multiple Named Views

在根状态下定义一次 - 作为 View

如果Contact View / Controller 是静态的,我们可以将它们挂接到超根状态:

.state("root", {
    views : {        
        "" : {
           template: "<ui-view />" // here will be injected all children
        }
        "contact@" : {
           ... //setting of the Contact view / controller
        }
    }
}

现在,每个“父”状态都可以从上述内容中获益,而不会影响 urlname (如果parent 设置被使用)

.state("someState", {
    parent: "root"
    ...

关于javascript - 使用 Angular UI Router,如何使一个状态成为所有状态的子状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28389380/

相关文章:

javascript - 为什么 angular ng-disabled 与 bootstrap btn 类一起使用?

c++ - 使 QDialog 成为操作系统的模态

ios - SwiftUI:如何关闭模式表,然后一起执行导航链接

iphone - 在模态视图 Controller 中调用 comeFirstResponder 时出现键盘动画问题

javascript - AngularJS ng-model 不适用于动态创建的输入字段

Javascript修改元素事件函数的参数

javascript - 使用 Netlify URL 问题部署的 React Redux 应用程序

javascript - 如何在制定谷歌标签管理器后调用我的一些脚本?

javascript - IE9 忽略 Angular 对象(在 ngRepeat 中)

javascript - AngularJS $http.post 不适用于 Chrome,仅适用于 IE