角度ディレクティブに奇妙な問題があります。
これは、私の(2)の質問に埋め込まれた事実の詳細な説明です。
drtv-a と drtv-b の 2 つのディレクティブがあります。drtv-a は、そのテンプレート drtv-b 内で使用します
drtv-a テンプレート:
<drtv-b some-attribute="something"></drtv-b>
html 要素の別の部分で drtv-a を使用する方法を次に示します。
<drtv-a some-other-attribute="other something"></drtv-a>
drtv-a は で定義されreplace:true
ます。そのコントローラーで私はぶら下がっています$scope.something ={...}
drtv-b は で定義されてscope:true
おり、一度使用すると、所有者のスコープに実際に「何か」が含まれていることを検証および検証しています。
問題:
drtv-b の検証コードは、drtv-a コントローラーが実行される前に実行されます。これにより、アプリケーションで drtv-b の検証が失敗するという問題が発生します (プロパティ「何か」が見つからないため)。
長い調査の結果、問題は drtv-a 定義、replace:true
定義 !にあることがわかりました。
これreplace:true
により、drtv-a を使用したテンプレートの html が次のようになります。
<drtv-b some-attribute="something" some-other-attribute="other something"></drtv-b>
それは私が期待しreplace:true
ていたことですが(ドキュメントによると)、角度構造の実行順序も(予期せず)変更されました。内部ディレクティブコード(drtv-b)は外部ディレクティブ(drtv-b)の前に実行されるようになりましたa) コントローラーが適切に開始する機会があった。これは当然のことながら、(望んでいる + 期待されている + 文書化されている) 動作ではありません。
私の最初の質問: なぜそれが起こるのですか? それはバグですか、それとも私が理解できないものですか?
次に、さらに奇妙な問題を発見しました。
要素内に含まれるように drtv-a のテンプレートを変更した場合<div>
:
<div>
<drtv-b some-attribute="something"></drtv-b>
</div>
定義を drtv-a に戻し、replace:true
angular が置換を実行した後、html コードは次のようになります。
<div some-other-attribute="other something">
<drtv-b some-attribute="something"></drtv-b>
</div>
そしてそれはOKです!
(つまり、drtv-a コントローラー コードは、それを使用する drtv-b コードの前に実行されます。)
私の 2 番目の質問: コードをコンテナー要素でラップするだけで問題が解決するのはなぜですか? フレームワークのその弱くて堅牢ではない動作ではありませんか?