2

我正在创建一个网格小部件的复杂指令,但我不确定我应该在哪里公开网格指令 API,即它的属性(例如selectedItems)和方法(例如scrollRowIntoView(rowIndex))。

我正在考虑的选项是:

  1. 在范围上公开 API (我的指令定义了一个隔离范围)。
  2. 在指令的控制器中公开 API (如果我理解正确,这就是在 中所做的 ngFormDirective)。
  3. 在范围上公开一个网格对象,进而公开 API。
  4. 先前选项之间的某种混合(例如,作用域上公开的属性,控制器中的方法)。

我想知道的是:

  • 此用例是否有最佳实践?
  • 每种替代方案的优缺点是什么?
  • 还有其他有效的替代方案吗?

谢谢!

4

1 回答 1

0

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

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

在其他情况下,您不能真正使用属性,例如您的scrollRowIntoView()示例。这将是在指令控制器中公开的一个很好的候选者,因为当系统中发生其他事情(例如 DOM 事件)时,指令用户可能想要调用它。

因此,您应该将您的 API 公开为发生在网格内部的事件(您控制的事物)的属性,例如onresizeondelete或其他。您当然也可以在控制器中公开它们。

当您的指令需要对外部事件scrollRowIntoView()(例如

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

TL;博士

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

于 2013-03-07T09:51:56.640 回答