AngularJSディレクティブはAとEを制限します


112

私は小さなチームで働いており、AngularJSでビルドして、いくつかの基本的な標準とベストプラクティスを維持しようとしています。特に、Angularは比較的新しいです。

私の質問は、ディレクティブに関してです。より正確には、restrictオプション。

私たちの一部はrestrict: 'E'このよう<my-directive></my-directive>にhtml を使用しています。

他の人たちはhtml restrict: 'A'を使用<div my-directive></div>している。

そして、もちろん、restrict: 'EA'上記のいずれかを使用することができます。

現時点では大した問題ではありませんが、このプロジェクトの規模が大きくなると、誰もがそれを見て、何が起こっているのかを簡単に理解してもらいたいと思います。

物事の属性または要素の方法に賛成/反対はありますか?

属性よりもsay要素を選択する場合に知っておくべき落とし穴はありますか?

回答:


100

ドキュメントによると:

属性と要素のどちらを使用すればよいですか?テンプレートを制御するコンポーネントを作成する場合は、要素を使用します。この一般的なケースは、テンプレートの一部にドメイン固有言語を作成する場合です。既存の要素を新しい機能で装飾する場合は、属性を使用します。

完全な答えを得るために、落とし穴に関する以下のコメントを編集してください。

AngularJS 1.3からAngularJSチームによってサポートが中止されたInternet Explorer <= 8で実行する必要があるアプリを構築していると仮定して、アプリを機能させるには、次の手順に従う必要があります。https://docs.angularjs .org / guide / ie


3
私はそれらのドキュメントを上下に読みましたが、これを見逃しました:)ありがとう。
ダレンウェインライト

3
この説明には、落とし穴や長所/短所は含まれていません。
コンスタンティンクラス

落とし穴についてそれに応じて私の答えを更新しました。ここでは、特にAngularチームによって推奨および説明されている場合は、ベストプラクティスについてもっと話していると思うので、賛否両論については触れませんでした。
ngasull

1
「ここでは、特にAngularチームが推奨および説明している場合は、ベストプラクティスについてもっと話していると思うので、賛否両論については触れませんでした。」え?:)
Alexander Mills

169

restrictは、ディレクティブタイプを定義するためのもので、A(Attribute)、C(Class)、E(Element)、およびM(coMment)のいずれかですDoc。ディレクティブの名前は次のとおりであるとします。

タイプ:使用法

A = <div Doc></div>

C = <div class="Doc"></div>

E = <Doc data="book_data"></Doc>

M = <!--directive:Doc -->


2
@nikunjの答えほど明確ではありませんが、彼らの答えを見た後、私はあなたの答えを理解しています...
Alexander Mills


7

IE8では、要素はそのままではサポートされていません。IE8がカスタムタグを受け入れるようにするには、いくつかの作業を行う必要があります。

要素に対して属性を使用する利点の1つは、同じDOMノードに複数のディレクティブを適用できることです。これは、要素をタグの束にラップする必要なく、追加の属性を使用してラベルなどを強調表示、無効化、または追加できるフォームコントロールなどの場合に特に便利です。


5

私が知っている落とし穴の1つは、カスタム要素のIEの問題です。ドキュメントから引用したように:

3)などのカスタム要素タグを使用しない(代わりに属性バージョンを使用)

4)カスタム要素タグを使用する場合、IE 8以下を満足させるためにこれらの手順を実行する必要があります

<!doctype html>
  <html xmlns:ng="http://angularjs.org" id="ng-app" ng-app="optionalModuleName">
    <head>
      <!--[if lte IE 8]>
        <script>
          document.createElement('ng-include');
          document.createElement('ng-pluralize');
          document.createElement('ng-view');

          // Optionally these for CSS
          document.createElement('ng:include');
          document.createElement('ng:pluralize');
          document.createElement('ng:view');
        </script>
      <![endif]-->
    </head>
    <body>
      ...
    </body>
  </html>

4

落とし穴:

  1. <my-directive></my-directive>回避策なしでIE8で機能しないような独自のhtml要素の使用(https://docs.angularjs.org/guide/ie
  2. 独自のhtml要素を使用すると、html検証が失敗します。
  3. 等しい1つのパラメーターを持つディレクティブは、次のように実行できます。

<div data-my-directive="ValueOfTheFirstParameter"></div>

これの代わりに:

<my-directive my-param="ValueOfTheFirstParameter"></my-directive>

我々はいけない。この2つの事実であればあるため、カスタムHTML要素を使用します。

サードパーティのフレームワークによるすべてのディレクティブは、次の2つの方法で記述できます。

<my-directive></my-directive>

または

<div data-my-directive></div>

同じことをします。


1
スコープパラメータが1のディレクティブを作成する場合は、Aを使用する方が簡単です。追加の属性を作成する必要がないためです。
コンスタンティンクラス

追加とはどういう意味ですか?どちらの選択肢にも属性が1つだけあります。
よりよいオリーブ

3

要素に関する2つの問題:

  1. 古いブラウザでの悪いサポート。
  2. SEO-Googleのエンジンはそれらを好まない。

属性を使用します。


要素としてのディレクティブはSEOの問題を引き起こす可能性がありますか?びっくりしました。そして、replace属性はtrueどうですか?
chalasr

1
これらの主張には参照が必要です。ポイント1は他の場所ではかなり確立されていますが、ポイント2に関する情報源を参照してください
rinogo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.