Ui-router 状态更改:保留控制器和范围但销毁 DOM
Ui-router State Change: Keep Controller and Scope but Destroy DOM
我正在使用 ui-router 1.0.0-beta.3,angular 1.5。到目前为止,ui-router 很棒!
我有一个根状态,到目前为止有一些 child 状态,但我注意到在兄弟姐妹之间切换(children of the same root parent)会导致完全重新创建状态我transition/go到。
我想保留范围变量,因为在我的应用程序中,用户可能会切换一些按钮、输入日期等,然后可能会切换到另一个状态,做一些事情,然后切换回去,但现在他们的所有部分工作不见了。我还希望能够为 "inactive" 状态销毁 DOM 的选项,因为在实践中某些状态可能会变得非常大,或者用户可能会创建很多 DOM 所以我'对于某些州,我希望 DOM 尽可能轻。
我明白 ui-router-extras sticky-states 功能就是这个!当我想销毁某些组件上的 DOM 时,我可以使用 $state.includes 函数来定位。但是,似乎 ui-router-extras 不适用于 ui-router 1.0.0-beta.3。作者确实为较新的 ui-router 制作了一个端口,但该版本是打字稿,我不确定如何将其编译成单个 js 文件。参见:https://github.com/ui-router/sticky-states/issues/4
也许我需要一个不使用 sticky-states 的解决方案 --- 有什么想法吗?我正在考虑使用服务来缓存范围值,并且确实阅读了一些其他的 SO 答案来解决这个问题。这意味着,对于每个组件,我需要处理要缓存的范围值等。这绝对是一种可能性,但我想知道是否有人对 ui-router 有任何其他技术或知识,这样也许有完成我所追求的另一种方法:在转换更改时缓存 controller/scope。
阅读作者的 typescript 源代码(这是一种乐趣,写得很好的代码)来自:
https://github.com/ui-router/sticky-states/blob/master/src/stickyStates.ts
我决定将它迁移到我在 javascript 中自己的服务,这将与 ui.router 1.0.0-beta.3 兼容。顺便说一句,ui.router 1.0.0-beta.3 可在以下位置获得:
https://unpkg.com/angular-ui-router@1.0.0-beta.3/release/angular-ui-router.js
我的方法是:因为 1.0.0-beta.3 似乎没有 onCreate 转换挂钩,所以我会装饰 $transitions.create 函数本身。为此,我需要在装饰中注入大量辅助函数和粘性状态的核心功能。所以我让 StickyStatesUtil 提供程序为我做这件事。
迁移由两部分组成:(1) 一个名为 sticky-states-util 的模块,它创建 StickyStatesUtil 提供程序,以及一个用于检查 state/state-name 是否处于非活动状态的有用服务,以及一个inactiveEvent,如果设置为一个值,将导致 $rootScope 广播一个 json 非活动状态名称映射,供应用程序中的任何内容使用。如果未设置,则跳过。 (2),angular 应用程序中的实际配置块,它注入 $provide 并用它来装饰 $transitions 服务,并带有一个新的 "create" 函数。
由于其他几个人和我在同一个地方,我在 github 上提供了此代码:
我正在使用 ui-router 1.0.0-beta.3,angular 1.5。到目前为止,ui-router 很棒!
我有一个根状态,到目前为止有一些 child 状态,但我注意到在兄弟姐妹之间切换(children of the same root parent)会导致完全重新创建状态我transition/go到。
我想保留范围变量,因为在我的应用程序中,用户可能会切换一些按钮、输入日期等,然后可能会切换到另一个状态,做一些事情,然后切换回去,但现在他们的所有部分工作不见了。我还希望能够为 "inactive" 状态销毁 DOM 的选项,因为在实践中某些状态可能会变得非常大,或者用户可能会创建很多 DOM 所以我'对于某些州,我希望 DOM 尽可能轻。
我明白 ui-router-extras sticky-states 功能就是这个!当我想销毁某些组件上的 DOM 时,我可以使用 $state.includes 函数来定位。但是,似乎 ui-router-extras 不适用于 ui-router 1.0.0-beta.3。作者确实为较新的 ui-router 制作了一个端口,但该版本是打字稿,我不确定如何将其编译成单个 js 文件。参见:https://github.com/ui-router/sticky-states/issues/4
也许我需要一个不使用 sticky-states 的解决方案 --- 有什么想法吗?我正在考虑使用服务来缓存范围值,并且确实阅读了一些其他的 SO 答案来解决这个问题。这意味着,对于每个组件,我需要处理要缓存的范围值等。这绝对是一种可能性,但我想知道是否有人对 ui-router 有任何其他技术或知识,这样也许有完成我所追求的另一种方法:在转换更改时缓存 controller/scope。
阅读作者的 typescript 源代码(这是一种乐趣,写得很好的代码)来自:
https://github.com/ui-router/sticky-states/blob/master/src/stickyStates.ts
我决定将它迁移到我在 javascript 中自己的服务,这将与 ui.router 1.0.0-beta.3 兼容。顺便说一句,ui.router 1.0.0-beta.3 可在以下位置获得:
https://unpkg.com/angular-ui-router@1.0.0-beta.3/release/angular-ui-router.js
我的方法是:因为 1.0.0-beta.3 似乎没有 onCreate 转换挂钩,所以我会装饰 $transitions.create 函数本身。为此,我需要在装饰中注入大量辅助函数和粘性状态的核心功能。所以我让 StickyStatesUtil 提供程序为我做这件事。
迁移由两部分组成:(1) 一个名为 sticky-states-util 的模块,它创建 StickyStatesUtil 提供程序,以及一个用于检查 state/state-name 是否处于非活动状态的有用服务,以及一个inactiveEvent,如果设置为一个值,将导致 $rootScope 广播一个 json 非活动状态名称映射,供应用程序中的任何内容使用。如果未设置,则跳过。 (2),angular 应用程序中的实际配置块,它注入 $provide 并用它来装饰 $transitions 服务,并带有一个新的 "create" 函数。
由于其他几个人和我在同一个地方,我在 github 上提供了此代码: