AngularJS:为什么$scope数据不能在ui路由器状态更改时保持不变?

AngularJS:为什么$scope数据不能在ui路由器状态更改时保持不变?,angularjs,angular-ui-router,persistent-storage,Angularjs,Angular Ui Router,Persistent Storage,我有两个视图,每个视图都有一个控制器,每个视图代表一个UI路由器状态 如果我在一个控制器中设置$scope变量,将状态更改为离开,然后返回,变量不再包含指定的值 我可以通过使用as服务来存储状态更改期间的数据,因此我的代码可以正常工作 我想象每次ui路由器切换状态时,它都会破坏旧状态的对象,并实例化新状态的对象 我只是好奇为什么事情是这样设计的。有人能解释一下吗?正如你所说,AngularJS控制器的路由思想是,它们只与当前正在使用的对象相关。在这种情况下,路由被视为树中的节点,如果从任何一个节

我有两个视图,每个视图都有一个控制器,每个视图代表一个UI路由器状态

如果我在一个控制器中设置
$scope
变量,将状态更改为离开,然后返回,变量不再包含指定的值

我可以通过使用as服务来存储状态更改期间的数据,因此我的代码可以正常工作

我想象每次
ui路由器
切换状态时,它都会破坏旧状态的对象,并实例化新状态的对象


我只是好奇为什么事情是这样设计的。有人能解释一下吗?

正如你所说,AngularJS控制器的路由思想是,它们只与当前正在使用的对象相关。在这种情况下,路由被视为树中的节点,如果从任何一个节点遍历到任何其他非子节点,那么假设旧数据仍然相关可能是不合逻辑的。但是,如果您确实在子状态中导航,那么保存数据再次变得合乎逻辑


范例

假设您有一个看起来像社交媒体网站的应用程序。你有一个带有消息列表的
feed
状态,一个
create
状态来添加你自己的帖子,还有
contacts
app。后者有一个子状态用于列出联系人(
contacts.list
),还有一个子状态用于查看单个联系人(
contacts.view
):

滚动浏览一个提要,如果您决定创建自己的消息,然后想返回到提要,那么您可能希望显示您停止的地方。然而,这需要在内存中存储加载的帖子和评论,以及页面上的位置和加载的图像。由于您的提要是动态的,并且已经查看的帖子可能不会再次显示,因此刷新提要并重新开始可能更符合逻辑

相比之下,如果您转到“联系人”页面,并因此被重新路由到“联系人列表”,则这些条目可能按字母顺序或按添加日期排序。如果您滚动浏览并决定查看联系人,那么当您返回时,顺序将有望保持不变,并且您可能不会有任何新联系人,因此最好从您停止的位置继续。这可以通过将联系人列表加载到父状态(可能带有上次查看联系人的ID)来完成,以查看您所在的位置。例如breadcrumb元素,它指示潜在路径树中的路径

如果从一种状态移动到另一种状态,则会在节点之间创建一条路径,例如离开
create
进入
feed
,或者输入
contacts
,然后输入
contacts.list
。如果您从
contacts.view
移动到
contacts.list
,您将保留
联系人
,因此控制器将保持使用状态-它永远不会被销毁


在历史中向后移动与正常导航

不过,这里忽略了一个重要的区别,即通过移动应用程序中的向后箭头或通过浏览器上的后退按钮后退。这与点击按钮进入主页形成对比,因为它假设主页在过去已经加载


在许多移动应用程序中,导航被视为一个流程,尽可能避免使用大型菜单。相反,更多的注意力放在创建历史记录上,这样以前访问过的页面都可以通过向左滑动或始终单击相同的按钮重新访问,无论它们在树中的什么位置。此外,使用移动应用程序时,无法假定可靠的网络连接,因此认为保持旧页面不变比从服务器刷新和重新蚀刻要好。这也是基于AngularJS的框架(如Ionic)提供特定页面历史记录功能的原因。

正如您所说,带有路由的AngularJS控制器背后的想法是,它们只与当前使用的对象相关。在这种情况下,路由被视为树中的节点,如果从任何一个节点遍历到任何其他非子节点,那么假设旧数据仍然相关可能是不合逻辑的。但是,如果您确实在子状态中导航,那么保存数据再次变得合乎逻辑


范例

假设您有一个看起来像社交媒体网站的应用程序。你有一个带有消息列表的
feed
状态,一个
create
状态来添加你自己的帖子,还有
contacts
app。后者有一个子状态用于列出联系人(
contacts.list
),还有一个子状态用于查看单个联系人(
contacts.view
):

滚动浏览一个提要,如果您决定创建自己的消息,然后想返回到提要,那么您可能希望显示您停止的地方。然而,这需要在内存中存储加载的帖子和评论,以及页面上的位置和加载的图像。由于您的提要是动态的,并且已经查看的帖子可能不会再次显示,因此刷新提要并重新开始可能更符合逻辑

相比之下,如果您转到“联系人”页面,并因此被重新路由到“联系人列表”,则这些条目可能按字母顺序或按添加日期排序。如果您滚动浏览并决定查看联系人,那么当您返回时,顺序将有望保持不变,并且您可能不会有任何新联系人,因此最好从您停止的位置继续。这可以通过将联系人列表加载到父状态(可能带有上次查看联系人的ID)来完成,以查看您所在的位置。例如breadcrumb元素,它指示潜在路径树中的路径

如果从一种状态移动到另一种状态,则会在节点之间创建一条路径,例如离开
create
进入
feed
,或者输入
contacts
,然后输入
contacts.list
。如果你从<
feed -------- create -------- contacts
                           ______|______
                          /             \
                         /               \
                        /                 \
                  contacts.list     contacts.view