[解決済み] AngularJSで独自のスコープ*を持つカスタムディレクティブ内から親スコープにアクセスするにはどうすればよいですか?
質問
ディレクティブ内の "parent"スコープにアクセスする方法を探しています。 スコープ、transclude、require、変数(またはスコープ自体)を上から渡すなど、どのような組み合わせでもかまいません。 しかし、完全にハチャメチャなものやメンテナンス不可能なものは避けたいのです。 例えば、今すぐできることとして
$scope
を反復処理する。
$sibling
のスコープから概念的な "parent"を探します。
私が本当に欲しいのは、次のようなものです。
$watch
を親スコープで表現することができます。 それができれば、こっちでやろうとしていることが実現できる。
AngularJS - 変数で部分的にレンダリングする方法は?
重要な注意事項
は、ディレクティブが同じ親スコープ内で再利用可能でなければならないことです。 そのため、デフォルトの動作 (scope: false) ではうまくいきません。 私はディレクティブのインスタンスごとに個別のスコープが必要で、そのためには
$watch
を親スコープに存在する変数に変換します。
コードサンプルは1000字の価値がありますから。
app.directive('watchingMyParentScope', function() {
return {
require: /* ? */,
scope: /* ? */,
transclude: /* ? */,
controller: /* ? */,
compile: function(el,attr,trans) {
// Can I get the $parent from the transclusion function somehow?
return {
pre: function($s, $e, $a, parentControl) {
// Can I get the $parent from the parent controller?
// By setting this.$scope = $scope from within that controller?
// Can I get the $parent from the current $scope?
// Can I pass the $parent scope in as an attribute and define
// it as part of this directive's scope definition?
// What don't I understand about how directives work and
// how their scope is related to their parent?
},
post: function($s, $e, $a, parentControl) {
// Has my situation improved by the time the postLink is called?
}
}
}
};
});
解決方法は?
参照 AngularJSのスコーププロトタイピング/プロトタイピング継承のニュアンスを教えてください。
要約すると、ディレクティブがその親にアクセスする方法 (
$parent
) のスコープは、そのディレクティブが作成するスコープの種類に依存します。
-
デフォルト(
scope: false
) - ディレクティブは新しいスコープを作らないので、ここでは継承はありません。 ディレクティブのスコープは、親/コンテナと同じスコープになります。 リンク関数では、最初のパラメータ (通常はscope
). -
scope: true
- ディレクティブは、親スコープをプロトタイプ的に継承した新しい子スコープを作成します。 親スコープで定義されたプロパティは、ディレクティブが使用できるようになります。scope
(プロトタイプ継承のため)。 ただ、プリミティブスコープのプロパティに書き込むと、ディレクティブスコープに新しいプロパティが作成されます(同じ名前の親スコープのプロパティは隠されたり、影になったりします)。 -
scope: { ... }
- ディレクティブは、新しい分離/隔離されたスコープを作成します。 これはプロトタイプ的に親スコープを継承するものではありません。 親スコープにアクセスするには$parent
しかし、これは通常推奨されません。 代わりに、ディレクティブが使用されるのと同じ要素で、どの親スコープのプロパティ (や関数) を必要とするかを=
,@
および&
という表記があります。 -
transclude: true
- ディレクティブは、新しい "transcluded" の子スコープを作成し、それはプロトタイプ的に親スコープから継承されます。 ディレクティブが分離スコープも作成する場合、transcluded と分離スコープは兄弟になります。 ディレクティブが$parent
プロパティは、同じ親スコープを参照しています。
Angular v1.3アップデート : ディレクティブが孤立したスコープも作成する場合、トランスクルードされたスコープは孤立したスコープの子として扱われるようになりました。 transcluded スコープと isolate スコープは兄弟ではなくなりました。 また$parent
プロパティは、分離されたスコープを参照するようになりました。
上記リンクに4種類すべての例と写真があります。
ディレクティブのコンパイル関数でスコープにアクセスすることはできません(ここに書いてある通りです。 https://github.com/angular/angular.js/wiki/Dev-Guide:-Understanding-Directives ). ディレクティブのスコープにアクセスできるのは、リンク関数内です。
見ている。
上記1.と2.について: 通常、ディレクティブが必要とする親プロパティを属性で指定し、それを $watch します。
<div my-dir attr1="prop1"></div>
scope.$watch(attrs.attr1, function() { ... });
オブジェクトのプロパティを監視している場合は、$parse を使用する必要があります。
<div my-dir attr2="obj.prop2"></div>
var model = $parse(attrs.attr2);
scope.$watch(model, function() { ... });
上記3.(スコープの分離)については、ディレクティブのプロパティにつける名前に注意して
@
または
=
という表記があります。
<div my-dir attr3="{{prop3}}" attr4="obj.prop4"></div>
scope: {
localName3: '@attr3',
attr4: '=' // here, using the same name as the attribute
},
link: function(scope, element, attrs) {
scope.$watch('localName3', function() { ... });
scope.$watch('attr4', function() { ... });
関連
-
[解決済み] 方法 $state.go()
-
[解決済み] select 要素のデフォルト値を設定するための ng-option の使用方法
-
[解決済み] ディレクティブ '...' が要求するコントローラ 'ngModel' が見つかりません。
-
[解決済み] Angularのui-routerでデフォルトの状態を設定する方法
-
[解決済み] Angular JSによるシンプルなポップアップ
-
[解決済み] AngularJSを使用して、ブラウザのコンソールで$scope変数にアクセスするにはどうすればよいですか?
-
[解決済み] AngularJSで$scope.$watchと$scope.$applyを使用するにはどうすればよいですか?
-
[解決済み] 子コントローラから親スコープにアクセスするAngularJS
-
[解決済み】AngularJSのディレクティブスコープにおける「@」と「=」の違いは何ですか?
-
[解決済み】ディレクティブ定義のtranscludeオプションの理解?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Angular ng-repeat エラー "リピータ内の重複は許可されません。"
-
[解決済み] AngularJSのシンプルな "Hello, world "が動作しない。
-
[解決済み] ReferenceError: Angularは定義されていません。
-
[解決済み] ajaxリクエスト時にAngularjsのローディング画面が表示される。
-
[解決済み] AngularJSの$parentは何を意味するのですか?
-
[解決済み] AngularJsでng-Cloakディレクティブを実際に使用する方法とは?
-
[解決済み] エラーです。10回の$digest()反復に達しました。動的なsortby述語で中断!?
-
[解決済み] 誰かangularjsの$qサービスの使用について説明してください。[重複しています]。
-
[解決済み] AngularJS コントローラにおける 'this' と $scope の比較
-
[解決済み】AngularJSのスコーププロトタイピング/プロトタイピング継承のニュアンスとは?