使用 ui 路由器实例化作用域和控制器

2024-03-24

我对控制器何时实例化感到困惑。另外,在嵌套状态时控制器如何实例化。我可能会感到困惑范围如何附加到视图和控制器,也就是说,如果每个视图都有自己的控制器和范围,或者它们共享相同的范围。

有人可以解释一下控制器何时被实例化吗?在嵌套路由下,所有视图是否共享一个控制器和作用域?当我切换状态并返回另一个控制器被实例化的状态时会发生什么?

以下是我的路线(配置文件):

.config (googleAnalyticsCordovaProvider, $stateProvider, $urlRouterProvider, IdleProvider, KeepaliveProvider) ->

   $stateProvider

  .state('app', {
    url: '/app',
    abstract: true,
    templateUrl: 'templates/menu.html',
    controller: 'AppController'
  })

  .state('app.pincode', {
    url: '/pincode',
    views: {
      menuContent: {
        templateUrl: 'templates/pincode-yield.html',
        controller: 'PincodeController'
      }
    }
  })

  .state('app.pincode.create', {
    url: '/create',
    views: {
      pincode: {
        templateUrl: 'templates/pincode-create.html',
        controller: 'PincodeController'
      }
    }
  })

  .state('app.pincode.pincodeLogin', {
    url: '/login',
    views: {
     pincode: {
        templateUrl: 'templates/pincode-login.html',
        controller: 'PincodeController'
      }
    }
  })

  .state('app.pincode.settings', {
    url: '/settings',
    views: {
      pincode: {
        templateUrl: 'templates/settings.html',
        controller: 'PincodeController'
      }
    }
  })

为了获得更详细的答案,我们可以/应该观察源代码并检查文档。让我尝试解释所有三个问题(并引用代码和文档)。

1. 控制器什么时候被实例化?

这里我们可以观察一下代码ui-view指示:

[$ViewDirective.$inject = \['$state', '$injector', '$uiViewScroll', '$interpolate'\];][1]

控制器相关于views. Those views,它们定义在 a 内部.state() as the views object:

.state('...', {
  // The view definition
  views : {
    '' : {
      template: ...
      controller: ...
      resolve: ..
    }
  },
  resolve: ...
}

所以,无论何时view (the ui-view)填充了状态视图内部定义的设置,它几乎充当标准但增强的指令.

1)找到模板,
2)解决方案已解决
...
x) 控制器被实例化...

查看目标 (ui-view指令)可以使用名称,并且可以由层次结构中的不同状态填充。

这可能意味着一个视图中可能有内容(e.g. title), 被定义为parent以及替换为child

// parent
.state('parent', {
  views : {
    '' : {...} // the main parent view, with ui-view="title"
    'title@parent' : { ...} // here we go and fill parent's ui-view="title"
  },
  ...
}

// child
.state('parent.child', {
  views : {
    'title' : { ...} // here we change the parent's target ui-view="title"
  },
  ...
}

上述状态定义将(每当我们在这两种状态之间转换时) do:

  • The $state.go('parent')- 定义在的视图(模板、控制器...)'title@parent' : { ...}将被注入到目标中ui-view="title"并如上所述实例化

  • The $state.go('parent.child')- 几乎相同,只是视图将从子状态/视图定义中获取'title' : { ...}。这将替换的内容ui-view="title"并将按上述方式实例化

每次我们去的时候都会发生这种情况从父母到孩子 and 从孩子到父母.

2. 在嵌套路由下,所有视图是否共享一个控制器和作用域?

一个简单的答案是NO, 有no共同分享。

实际上,每个控制器 has 它自己的范围,从父视图范围创建的视图。首先是文档:

子状态从父状态继承什么? https://github.com/angular-ui/ui-router/wiki/Nested-States-%26-Nested-Views#what-do-child-states-inherit-from-parent-states

...

仅通过视图层次结构进行范围继承 https://github.com/angular-ui/ui-router/wiki/Nested-States-%26-Nested-Views#scope-inheritance-by-view-hierarchy-only

请记住,如果状态视图是嵌套的,则作用域属性仅沿状态链继承。范围属性的继承与状态的嵌套无关,而与视图(模板)的嵌套有关。

您完全有可能拥有嵌套状态,其模板会在站点内的各个非嵌套位置填充 ui 视图。在这种情况下,您不能期望在子状态视图中访问父状态视图的作用域变量。

所以,每当我们controller (好吧view带模板、控制器...)注入父母的目标ui-view="..."它获得继承范围:

newScope = scope.$new();

简而言之,这意味着JS 对象 (e.g. scope.Model = {})可以在孩子和家长之间共享。

$scope.Model.id = 1; // will refer to the same id in both parent & child

However,基本 Javascript 类型不是通过引用传递的,因此它们的值不会在作用域之间自动同步:

// set in parent
$scope.id = 1;
// in child after inherted still === 1
$scope.id = 2; // now 2 for a child, different value in parent - still === 1

值得在这里阅读更多有关原型继承的内容:
AngularJS 中的范围原型/原型继承有哪些细微差别? https://stackoverflow.com/q/14049480/1679310

3. 当我切换状态并返回到某个状态时会发生什么 - 是否会实例化另一个控制器?

这取决于。

如果父子视图(记住ui-view="title" above)被子视图替换,然后重新创建(从孩子到父母的转变)- 这样的控制器将被重新初始化(如上所述)。

但当我们谈论主要父视图 (通常是未命名的),这代表家长 (例如下面带有控制器“ParentMainCtrl”的未命名视图)

.state('parent', {
  views : {
    '' : {  //  // the main parent view
      controller: 'ParentMainCtrl',
    }
    'title@parent'
    'tooltip@parent'
  },

然后我们可以确定这样的控制器不会被重新实例化。它在其所有子级以及父级的一生中都存在(未选择子状态).

要重新加载此视图/控制器,我们必须使用一个选项reload

$state.go(to, 参数, 选项) http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.%24state

... options 选项对象。选项有:

  • ...
  • reload - {boolean=false},如果 true 将强制转换,即使状态或参数没有更改,也称为相同状态的重新加载。它与 reloadOnSearch 不同,因为当您想要在一切都相同(包括搜索参数)时强制重新加载时,您可以使用它。

希望有点帮助。有关更多信息,请查看以下资源:

  • 嵌套状态和嵌套视图 https://github.com/angular-ui/ui-router/wiki/Nested-States-%26-Nested-Views
  • 多个命名视图 https://github.com/angular-ui/ui-router/wiki/Multiple-Named-Views
  • API参考 http://angular-ui.github.io/ui-router/site/#/api/ui.router
  • State.js https://github.com/angular-ui/ui-router/blob/master/sample/app/contacts/contacts.js of 示例应用程序 http://angular-ui.github.io/ui-router/sample/#/ - 我想说的是最好的记录代码ever
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ui 路由器实例化作用域和控制器 的相关文章

随机推荐

  • 使用自定义属性创建有效的站点地图

    我正在一个网站上工作 我的网站有一个 sitemap xml 文件 该文件可以看到here http www ecofic com resources root sitemap xml 如果你向下滚动 你会看到一个url包含一些自定义标签的
  • Git hook 用于根据推送到远程服务器的分支更新各种 Web 文件夹

    我正在使用 Gitosis Debian Lenny 开发一个 Web 应用程序 我希望能够将其推送到不同的远程存储库 位置 从而允许应用程序的 前沿 发布候选 和 生产 版本镜像物理 Web 目录和代码库 我希望每个目录都有一个应用程序分
  • 使用纯 Observable 与数组(来自订阅)

    我想知道有关使用纯可观察值与订阅可观察值并使用数组的最佳实践 选项 1 纯可观察 this schools this angularFire database list schools 然后在 HTML 中使用异步管道 和 rxjs 运算符
  • 替换 JS 中的变音符号

    我正在比较字符串 并且必须替换 JS 中的变音符号 但 JS 似乎无法识别字符串中的变音符号 文本来自数据库 在浏览器中变音确实显示得很好 function replaceUmlauts string value string toLowe
  • 如何在C#中实现内存事务范围?

    我们有一个缓存 我想在其中放置一些事务范围 以便任何进程都必须显式 提交 它想要对缓存对象执行的更改 并且可以在进程中途失败时回滚任何更改 现在 我们正在根据 get 请求深度克隆缓存的对象 它可以工作 但它不是一个干净的解决方案 并且还涉
  • ASP.NET - bin 目录与在 web.conf 中添加程序集

    我对 ASP NET 编程相对较新 但不是一般的编程 并且我一直在研究移交给我的一个项目 在这个项目中 有一个 bin 目录 其中包含大量各种 DLL 文件 然后 在 web conf 文件中的程序集结构内 在 XML 内 添加了大量其他程
  • ASP.NET MVC 4 中的 Web Api 中的路由

    我正在将 Web api 与 ASP NET MVC 4 结合使用 我有以下命名的控制器 客户控制器 控制器 客户 ApiController ApiController 早些时候我的CustomerApiController被命名为Cus
  • 在java中使用enum作为类

    我有一个班级enum在它和类中 其中包含list该对象的 public enum State ACTIVE NOT ACTIVE public class SomeObject State state public SomeObject S
  • 处理 java.lang.IllegalArgumentException:没有枚举常量的最佳方法是什么

    枚举类是这样的 public enum UserRoles ADMIN TEST 我想处理它 这样如果枚举中没有值 它就不应该抛出异常 我这样处理 for String roleString roleStrings if roleStrin
  • 如何使用 MajorUpgrade 和 RemoveFeatures 仅删除特定功能并仍然卸载产品的先前版本

    我从与 VS 2010 一起打包的 Microsoft 安装程序切换到 Wix 3 6 我试图通过使用
  • 如何进行WCF REST缓存?

    我有一个 WCF REST 服务 需要返回静态数据和一些基于客户端 胖 Windows 客户端 传入的参数的过滤数据 由于提供此服务的数据存储不会经常更改 因此我想在服务上缓存此数据 服务器端缓存 数据存储是 Azure 表 我知道 WCF
  • 使用 DirectX 播放音频时出现加载程序锁定异常

    我正在尝试使用 DirectX dll 播放音频文件 Audio FromFile Message 1 mp3 Play 但检测到加载器锁异常 如下所示 我不是分析堆栈跟踪的专家 如何分析和解决装载机锁问题 检测到 LoaderLock M
  • 当 iframe 存在时,Android webview 将无法正确处理事件

    我遇到以下问题 我有一个 web 视图 在其中加载一个 iframe 我通过 javascript 修改 插入文本 内容文档 问题是 当内容变得太多 网络视图变得可滚动 并且当用户滚动时 触摸事件将无法正确处理 即用户将点击某处 光标将出现
  • 如何解决hadoop中的“文件只能复制到0个节点,而不是1个”?

    我有一个简单的 hadoop 作业 可以抓取网站并将其缓存到 HDFS 映射器检查 HDFS 中是否已存在 URL 如果存在 则使用它 否则下载页面并将其保存到 HDFS 如果下载页面时遇到网络错误 404 等 则完全跳过 URL 不会写入
  • 备份 git 存储库中的所有分支,保留已重新定位和强制的内容

    我正在寻找一种解决方案来备份多个共享 git 存储库 每个存储库都有多个分支 并且某些分支会被重新设置基址并被强制 我知道这违反了最佳实践 但这是我现在必须处理的事情 我在想一个简单的git clone mirror然后定期git remo
  • 连接整数变量最惯用的方法是什么?

    编译器似乎没有推断出整数变量作为字符串文字传递到concat 宏 所以我找到了stringify 将这些整数变量转换为字符串文字的宏 但这看起来很难看 fn date year u8 month u8 day u8 gt String co
  • 加载我的包时 Symfony 容器没有扩展

    我有一个捆绑包 在一段时间内运行良好 但是 我必须向其中添加一些自定义配置参数 因此我在包的 config yml 中编写了一些行 如下所示 acme my bundle special params param 1 param 2 配置在
  • 带有模块的 Ruby 类命名空间:为什么我会收到带有双冒号的 NameError 而不是模块块?

    我正在处理许多预先存在的文件 类和模块 并尝试为框架的不同组件提供更好的命名空间 我一直使用模块作为命名空间的方式 主要是因为这似乎是标准约定 并且能够 包含 框架的不同部分可能很有用 问题在于 全局命名空间下有大量本应存在于模块下的类 例
  • 什么是编程中的“序列化”对象? [复制]

    这个问题在这里已经有答案了 我到处都看到过 序列化 这个词 但从未解释过 请解释一下这是什么意思 序列化通常是指将抽象数据类型转换为字节流的过程 有时也序列化为文本 XML 或 CSV 或其他格式 重要的是它是一种简单的格式 无需理解即可读
  • 使用 ui 路由器实例化作用域和控制器

    我对控制器何时实例化感到困惑 另外 在嵌套状态时控制器如何实例化 我可能会感到困惑范围如何附加到视图和控制器 也就是说 如果每个视图都有自己的控制器和范围 或者它们共享相同的范围 有人可以解释一下控制器何时被实例化吗 在嵌套路由下 所有视图