我应该调用父指令控制器还是创建服务

时间:2015-09-17 12:15:36

标签: angularjs

我们说有一个"对话"指令,由"消息"指令。 message指令有一个删除它的按钮。 会话控制器有一种从列表中删除消息的方法。

在Angular documentation中,他们说我们可以使用"要求"从指令控制器访问父控制器。

而且here,答案建议也使用require,并且只有在你不能使用require时创建服务,因为2指令不相关。

从另一个控制器调用控制器是不是一个坏习惯? 我认为服务通常用于在控制器之间共享信息。

您认为使用deleteMessage方法创建服务并在消息控制器中注入此服务会更好吗?

2 个答案:

答案 0 :(得分:1)

我个人不喜欢在父或root上调用函数或类似的东西,因为它以一种隐式方式耦合。我更喜欢使用您提到的服务或将具体功能注入您的指令。

以下是两种方法的优缺点。请注意,这些都是基于我的个人经验(而且我不是专家)。

<强>服务

服务是单件,意味着整个应用程序中只有一个实例。如果您需要,这可以有几个优点:

  • 它总是在那里(你不需要明确地创建它)
  • 它可以缓存可能有用的数据,例如保持视图/页面的状态
  • 它可用于在不同组件之间交换数据
  • 可以在任何需要的地方轻松注入

这也可能导致一些缺点:

  • 如果不同的组件共享相同的服务,它们可能会弄乱彼此的数据
  • 组件(即指令)将取决于该服务,使指令的用户在他想要使用该指令的方式上没有灵活性(例如,当用户点击按钮时会发生什么)。这意味着基本上具体功能在指令中被“硬编码”。

我个人喜欢使用服务,如果他们有直接指向指令(或其他任何东西)或不存储任何状态,例如,如果他们只包含简单的帮助函数。

如果您的应用程序中有一个会话列表,那么我会考虑在公开addMessagedeleteMessagesortBy等功能的服务中实现该列表。等等。然后它可以注入任何需要访问该(中央)列表的组件。

将函数作为参数传递

另一方面,如果你有一个message - 指令,你可能也希望将它用于其他类型的消息..?那些消息不是来自conversation,而是来自mailbox(只是一个愚蠢的例子;))。然后我不会把服务和指令结合起来。您可以注入deleteMessage - 函数,在一种情况下会将其从conversation中删除,而在另一种情况下将其从mailbox中删除。

我认为这两种方法都是有效的,但始终取决于方案以及如何在应用程序上共享/重用组件。

第二种方法可能更好地从“耦合” - 相关,但是在大量参数的情况下以及在多个组件级别上传递参数时可能会变得复杂(例如,对于子 - 子 - 子指令)。

第一种方法很容易实现,并且可以有几个优点,但会导致组件直接耦合到该服务,从而降低其可重用性。

答案 1 :(得分:0)

您真的需要将删除按钮放在message指令中吗?

由于删除按钮是为了取消conversation控制器列表中的消息,我宁愿将按钮放在conversation视图中。

话虽如此,如果你真的想在message指令上有删除按钮,我只需将delete方法作为参数传递给你的指令。执行此操作时,您不必担心哪个控制器定义了该函数,您只需从子指令调用它(如果您希望父控制器执行它,只需将绑定函数传递给您的指令)。