Angular ui-router嵌套视图不刷新Angular Services检索的数据

时间:2014-01-28 19:11:56

标签: angularjs angular-ui-router

我有一个非常重要的Angular SPA,它使用ui-router来管理多个视图,其中许多视图同时可见。我需要模型在控制器之间可见,因此我编写的服务允许我让控制器下载已更新的模型数据的新副本。

我提前为问题的长度道歉,但我会说明问题,然后陈述我为解决问题所做的工作,我相信Angular社区的其他人一直在努力。

我相信我的问题不是理解控制器/视图的生命周期,因为我得到了第一次去那里时控制器正确初始化的行为,但是后来似乎永远不会再次运行,即使我使用类似的东西导航到它$state.go("state name")

在一个视图(设计示例)中,我显示了有关客户的信息摘要,在另一个视图中,我允许用户更新该客户的更详细的个人资料。我希望用户在详细视图中编辑客户姓氏,并让摘要视图自动识别更改并显示它。

我有一个fiddle,显示3个视图和一个简单的密码更改服务。流程如下:

  1. 您可以看到每个视图都已初始化,并显示从服务中检索到的初始密码。所有视图都与DataService同步。
  2. 中间视图允许您输入新密码并更改存储在服务中的密码。控制台日志记录确认该服务会像您期望的那样获取新密码。
  3. (奇怪的行为#1)当DataService收到新密码时,我希望其他2个视图(顶部和底部)显示新密码。他们没有...他们仍然显示初始密码。
  4. 有一个按钮允许用户通过state(原始的子状态)转到另一个$state.go("state name"),该按钮还会检索密码并显示密码。这首次 (参见#5)。现在顶视图显示过时的密码,中间视图显示新密码,底部显示新密码。这看起来很正常,因为在DataService包含新密码值后会调用新视图。
  5. (奇怪的行为#2)如果我在中间视图中单击并再次更改密码,然后单击按钮再次更改状态,则底部视图(在步骤#4中更新正常)不再更新其副本密码现在所有3个视图都显示不同的密码,即使我使用单个服务在控制器之间传递值,几乎无处不在寻找Angular最佳实践。
  6. 一些可能的解决方案:

    • Tim Kindberg有一个出色的幻灯片here,似乎建议使用ui-router的状态heirarchy 在需要从其他视图中获取值的视图中“传递”数据。对于较小规模的应用程序,我想我会解决这个问题,但我希望我们的应用程序有30多个视图显示来自100多个REST端点的数据。我觉得维护一个复杂的inheiritance树共享所有数据的应用程序并不舒服。特别是使用版本 0.2.8 的路由框架。
    • 我可以使用事件让控制器监听数据模型中的更改。这实际上运作良好。为了解决性能问题,我使用了$rootScope.emit()$scope.$onRootScope('event name')我在here找到的$watch装饰器。通过这种方法,我不太关心事件性能,而是关于将这个庞大的应用程序与一堆事件监听器连接在一起。关于使用角度事件here连接大型应用程序的智慧存在一个问题。
    • 对DataService中的值使用$watch?我没有尝试过这个但是由于性能原因,我很想在数百$digest es上使用这么大的应用程序。
    • 第三方库,如bacon.js(或其他任何一个),可以简化事件意大利面,或创建我的控制器可以观看的可观察模型,而不会有.service年龄的风险。当然,如果使用Angular有一个简洁的方法来处理我的问题,我宁愿不要使用第三方依赖项来混淆应用程序。
    • 允许控制器通过引用实际引用$watch模块的东西,所以我不必依赖大量的事件连接,复杂的状态层次结构,第三方库,或者为数百个{{1然后开始$digest以更新控制器对Angular服务的引用?
    • 某些解决方案依赖于经过时间考验的OO和设计模式,而不是第三方库或框架,其版本以 0。* 开头。

    提前致谢...我感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

这不是ui.router的问题。如果您打算将您的模型(您的数据服务)作为单一的事实来源,那么您必须避免破坏它。错误..对它的引用即是。在您的情况下,将一个primitve(一个字符串)直接分配给范围,而不是对它的引用。换句话说......

var password = {pw:'initial value'};

然后仅在

上设置/绑定
password.pw = newpassword

{{password.pw}}

继承人fiddle。此外还有一个关于范围的简短读物,它还包括一个角度聚会的视频,其中Misko谈到“在模型中总是有一个点”link以及$scope是怎样的揭露模型的地方,而不是你的模特。 (又不是指定像password = 'initial value'

这样的原语的地方

希望这有帮助!

答案 1 :(得分:0)

尝试删除离子导航视图的动画属性。 删除属性 动画=“滑动左右”

没关系。