如何公开widget指令API

时间:2013-03-07 09:22:07

标签: angularjs angularjs-directive

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

我正在考虑的选项是:

  1. 范围上公开API(我的指令定义为隔离的 范围)。
  2. 指令的控制器中公开API(如果我 正确理解这是在做什么 ngFormDirective)。
  3. 在范围上公开网格对象 转向暴露API。
  4. 之前的某种混合 选项(例如,在范围上公开的属性,方法中的方法) 控制器)。
  5. 我想知道的是:

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

    谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

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

当你的指令需要对诸如scrollRowIntoView()之类的外部事件做出反应时,你会在指令控制器中公开它,因为将这些钩子作为属性暴露是一个笨重的API。

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

<强> TL; DR

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