2

角度ディレクティブに奇妙な問題があります。

これは、私の(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:trueangular が置換を実行した後、html コードは次のようになります。

<div some-other-attribute="other something">
    <drtv-b some-attribute="something"></drtv-b>
</div>

そしてそれはOKです!

(つまり、drtv-a コントローラー コードは、それを使用する drtv-b コードの前に実行されます。)

私の 2 番目の質問: コードをコンテナー要素でラップするだけで問題が解決するのはなぜですか? フレームワークのその弱くて堅牢ではない動作ではありませんか?

4

1 に答える 1

0

申し訳ありませんが、ネストまたはreplace: false.

主にあなたと同様の問題が原因で、replace現在は非推奨です。ドキュメントを参照してくださいGitHub commitreplace: trueGitHub の問題AngularJS で置換が非推奨になっている理由に関する背景情報と問題の詳細

GitHubの問題から:

[...] angular 1.x から replace が消えることはありません (これについてはよくわかりませんが、大きな破壊的変更であるため、削除しないことはかなり確信しています。非推奨です、それだけです)。

replace: true には既知の非常にばかげた問題があり、その多くは合理的な方法で実際に修正できないため、推奨されていません。注意してこれらの問題を回避すれば、より多くの力が得られますが、新しいユーザーの利益のためには、「これは頭痛の種になるので、やらないでください」と言う方が簡単です.

于 2016-03-02T08:40:11.717 に答える