AngularJS:在控制器之间传递参数

AngularJS: pass parameter between controllers

本文关键字:参数 之间 控制器 AngularJS      更新时间:2023-09-26

我要做的事情:

我有一个ListView(或者更确切地说是一个手风琴(,它包含几个项目(为了简单起见,我们假设这些项目具有唯一的idname(。对于每个项目,我都希望包含一个到详细视图的链接,以显示和编辑该项目的属性(id除外(。

为此在谷歌上搜索会返回几个结果,例如:在Angular JS中的控制器之间传递数据?

据我所知,建议的解决方案包括:

ng-init:(请参阅创建时能否将参数传递给AngularJS控制器?(

我可以在ng-repeat中使用ng-init为列表中的每个项目初始化一个参数。然而,到目前为止,有角度的文件建议不要这样做:

ngInit的唯一适当用途是对ngRepeat的特殊属性进行混叠,如下面的演示所示。除此之外,您应该使用控制器而不是ngInit来初始化作用域上的值。

服务

建议使用服务在控制器之间共享全局变量。我已经在使用一项服务来保存我的项目列表,并使用对该服务的调用来添加/删除或更改项目。我还实现了一个getItem(id)方法,我想从详细视图的控制器调用它。但要做到这一点,我需要首先知道物品的id!

通过$routeParams传递值

Angular Phonecat教程通过$routeParams传递参数来解决类似的问题。虽然这会起作用,但这意味着我必须在详细信息视图的链接中包含我的项目的id。用户可以很容易地更改链接,并最终进入完全不同项目的详细信息视图。如果可能的话,我宁愿不在我的详细视图链接中公开内部id


这似乎是一个很常见的要求。我缺少什么最佳实践吗?

您有两个真正的替代方案(您已经确定(:

  • 使用服务
  • 将信息作为url的一部分传递

两者在技术上都是正确和可行的,但从语义和状态的角度来看,我更喜欢使用url。

由于您提供了一个可点击的链接,因此您链接到可链接的东西(即可以通过唯一url标识的项目或状态(是有意义的。如果你认为一个打开的手风琴项目更像是一个状态项目(而不是一个页面(,那么你可以看看ui路由器:https://github.com/angular-ui/ui-router

我不知道你为什么不喜欢在url中包含物品ID。毕竟,任何感兴趣的人都可以使用开发工具在UI中看到任何信息。如果您不想在UI中显示数据库模式信息,那么有各种ID模糊处理方法可以解决这个问题。