是否应将角度元素作为块或封装处理

时间:2015-07-17 14:00:11

标签: html angularjs angularjs-directive tags directive

使用元素指令时,我看到Angular元素指令有两种使用方式:

1。作为块级组件

元素的样式为display:block,是组件,其子元素是组件的子元素,因此元素本身就是组件。

使用指令:

<example class="Example"></example>

指令&lt; html:

<header class="Example-header"></header>
<img class="Example-image">
<footer class="Example-footer"></footer>

2。作为组件的内联包装

该元素保留为display:inline,并有效地充当组件本身的隐形包装器:

使用指令:

<example></example>

指令&lt; html:

<div class="Example">
  <header class="Example-header"></header>
  <img class="Example-image">
  <footer class="Example-footer"></footer>
</div>

显然每个都有优点和缺点,例如额外的标记,由于内联元素等导致的布局上下文丢失等,但是正确的方法吗?或者这是Angular的另一个变幻莫测?

2 个答案:

答案 0 :(得分:2)

我很惊讶没有人回复,但创建自定义指令背后的想法是能够创建可重用的代码片段,以满足您网站上的特定功能。

但是,此功能并不关心您要使用的样式。您当然可以在Angular中有条件地更改类和样式,但处理框架时的核心组件是数据。

话虽如此,在你的问题中加粗,没有“正确的方法”。制定指令以满足您的网站需求和风格。

答案 1 :(得分:1)

首先这可能是基于意见的,但我真的想分享我对此的看法。

如果你真的遵循做指令的角度方式,那么这些都不是正确的方法。

指令旨在向HTML元素添加行为。

指令越少添加HTML就越好,因为它可以让你更好地控制这个元素。

让我们举一个例子。

我们有一个数据网格(比方说ui-grid,它并不重要)

 <ui-grid ...>
    ...
 </ui-grid>

我有一个想法是添加一些按钮来添加或删除网格中的元素。 我第一次想出了这个

 <ui-grid ...>
    ...
 </ui-grid>
 <button ng-click="addItem()">Add</button>
 <button ng-click="removeItem()">Remove</button>

我对此非常满意,这没关系,但最后我需要在其他一些视图中使用这些按钮。我将不得不复制HTML,复制JS并使其适应集合。

常见错误

这显然不是一个好主意。

相反,我会做一个指示。让我们说“按钮列表”:它产生相同的HTML和行为。

 <ui-grid ...>
    ...
 </ui-grid>
 <button-list></button-list>

这很酷。

现在我有一些需要。在一个视图中我需要添加按钮为蓝色,在另一个视图上我不需要有删除按钮,在最后一个我希望按钮文本为“X”和“+”(这是一些客户要求提供真实的故事。)

我可以使用选项等列表制作一个大对象...但这非常痛苦,每次需要添加自定义不同的小行为时都需要触摸指令。

好的方法

现在让我们再想一想我想做什么。

我希望按钮与网格交互......这就是全部。这就是我们应该如何构建自定义指令。

然后我们可以这样生成这个指令:

 <div grid-button-container collection="mycollection">
     <ui-grid ...>
        ...
     </ui-grid>
     <button grid-add-item>Add</button>
     <button grid-remove-item>Remove</button>
 </div>

那么我们在这里有什么?我们有三种不同的指令。

  1. grid-button-container:它的职责是保存子指令的列表。
  2. grid-add-item:在click上添加一个函数,将一个元素添加到grid-button-container的集合中。
  3. grid-remove-item:在click上添加一个删除元素到grid-button-container集合的函数。
  4. grid-add-item和grid-remove-item都需要使用grid-button-container。

    我无法描述这个的所有实现(这需要太长时间),但我认为这是应该如何使用指令。比如几乎没有角度内置指令(ng- *)添加HTML并只添加一个行为我认为所有指令都应该以这种方式构建。

    亲:

    1. 您可以完全控制HTML
    2. 指令微不足道
    3. 真的可重复使用
    4. 缺点:

      1. 实施起来可能会更难,更长。
      2. 为了说明问题,你要问的两种方式是不同的。没有人比另一个更好,它只依赖于你自己的HTML组织,它将取决于指令的使用。

        希望它有所帮助。