2013-03-07 66 views
2

我创建一个网格小部件的复杂的指令,我不知道我应该在哪里揭露电网指令API,也就是说,它的性质(如selectedItems)和方法(如scrollRowIntoView(rowIndex) )。如何公开一个widget指令API

我正在考虑的选项包括:

  1. 揭露API的范围(我的指令定义一个孤立的 范围)。
  2. 暴露出指令的控制器的API(如果我 正确理解这是什么在 ngFormDirective完成)。
  3. 在范围上公开一个网格对象,其中 将公开该API。
  4. 某种混合之间 选项(例如属性暴露的范围,在控制器 方法)。

我想知道的是:

  • 是否有这个用例最佳实践
  • 什么是利弊为每个替代?
  • 是否有其他有效的替代方案?

谢谢!

回答

0

通常,您想要将绑定公开为指令上的属性。也就是说,如果我想将我的数组someItems绑定到您的网格,我希望您的指令看起来像这样:<my-grid my-items="someItems">

您也可以将钩子暴露为属性,例如“当网格调整大小时运行此函数”。如果我在我的示波器上有whenGridResized函数,我想将它设置为属性,如下所示:<my-grid onresize="whenGridResized()">

在其他情况下,您无法真正使用属性,例如scrollRowIntoView()示例。这是在指令控制器中公开的好选择,因为这是指令用户在系统中发生其他事情时可能需要调用的东西(如DOM事件)。

所以你应该公开你的API作为事件发生在你的网格内(你控制的东西)的属性,如onresizeondelete或其他。您当然也可以将它们暴露在控制器中。

当您的指令需要对外部事件如scrollRowIntoView()作出反应时,您应该在指令控制器中公开该指令,因为它将暴露此类挂钩为属性的笨重API。

你不应该通过范围公开你的API,因为你想为你的网格隔离范围。通过范围公开它将意味着您必须将它设置为范围父级,并且直接访问父范围几乎不是一个好主意。

TL; DR

的经验法则是,以公开为多,你可以为属性和方法,您的指令控制器上,当属性没有意义。在属性和控制器中公开相同的功能是一个好主意,因为很难预测用户如何使用您的指令。