web-dev-qa-db-ja.com

親スコープが指定されたAngularjsのすべての子スコープを取得する

親スコープが指定されたすべての子スコープのリストを取得する方法を知りたいです。スコープのプロパティから見つけることができるのは、$$ childHead、$$ childTail、$$ nextSibling、$$ prevSiblingです。

現在使用しているアプローチは、親からchildHeadを取得し、nextSiblingを使用してnextSiblingがnullになるまで次の子を取得することです。

より良いアプローチはありますか?すべての子に対してメソッド[getModel]を呼び出したい場合、これを行うより良い方法はありますか?

22
ritcoder

子ディレクティブは分離されたスコープを使用しており、親からは見えない独自の値を持っています。親スコープからこれらの値にアクセスしたい。

「子スコープへのアクセスが必要な親スコープ」の問題に対処する「角度のある方法」は、モデルを親に移動し、子スコープが親プロパティ/データを参照するようにすることですローカルプロパティ/コピー)。たとえば、これは、各反復に入力フォーム要素が含まれる場合(つまり、各反復に双方向のデータバインディングが必要な場合)ng-repeatを処理する方法です。 ng-model、ng-repeat、inputsの難易度)

ディレクティブを使用して、最初に親スコープ内のオブジェクトの配列を定義してから、「=」表記法(つまり、双方向データバインディング表記法)を使用して、分離された各子スコープがその親スコープ配列(または個々のオブジェクト)にアクセスするようにします。オブジェクトは共有されているため、分離されたスコープは親オブジェクトを参照します(ローカルコピーは取得されません)。現在、子スコープのプロパティに加えた変更は、実際には親スコープのプロパティを変更しています。

16
Mark Rajcok

すべてのAngularスコープはDOM要素にアタッチされます。現在の要素を使用して、到達したい子まで子を検査することから始めます。そこで、以下の関数を使用してスコープを取得します。

angular.element('#5th_element').scope();
25
wajatimur

AngularJS 1.3.2では、countChildScopesメソッドがngMockモジュールに追加されました。

/** 
 * @ngdocメソッド
 * @name $ rootScope.Scope#$ countChildScopes 
 * @module ngMock 
 * @description 
 *現在のスコープのすべての直接および間接の子スコープをカウントします。
 * 
 *現在のスコープはカウントから除外されます。カウントには、すべての分離子スコープが含まれます。
 * 
 * @returns {number}子スコープの合計数。
 */
 function countChildScopes(scope)
 {
 // jshint validthis:true 
 var count = 0; //現在のスコープを除外します
 var root = scope || angular.element(document).injector()。get( '$ rootScope'); 
 var pendingChildHeads = [root。$$ childHead]; 
 var currentScope; 
 
 while(pendingChildHeads.length)
 {
 currentScope = pendingChildHeads.shift(); 
 
 while(currentScope)
 {
 count + = 1; 
 pendingChildHeads.Push(currentScope。$$ childHead); 
 currentScope = currentScope。$$ nextSibling; 
} 
} 
 
 return count; 
} 

オブジェクトを戻り値として使用してIDを取得します。

 function enumerateChildScopes(scope)
 {
 // jshint validthis:true 
 var enum = {}; //現在のスコープを除外します
 var root = scope || angular.element(document).injector()。get( '$ rootScope'); 
 var pendingChildHeads = [root。$$ childHead]; 
 var currentScope; 
 
 while(pendingChildHeads.length)
 {
 currentScope = pendingChildHeads.shift(); 
 
 while(currentScope)
 {
 enum ["scope" + pendingChildHeads.length] = currentScope。$ id; 
 pendingChildHeads.Push(currentScope。$$ childHead); 
 currentScope = currentScope。$$ nextSibling; 
} 
} 
 
 return enum; 
} 

参考文献

5
Paul Sweatte