2017-11-13 6 views
0

私は、AngularJSのディレクティブをリンク機能の$ timeoutとともに持っています。

.directive('setValueInColorSelectionBlock', function($timeout) { 
 
    return { 
 
     restrict:'A', 
 
     scope:{ 
 
      setValueInColorSelectionBlock:"=setValueInColorSelectionBlock" 
 
     }, 
 
     link:function(scope, element, attrs) { 
 
      //able to access the scope 
 
      $timeout(function() { 
 
       //not able to access the scope 
 
      }); 
 
     } 
 
    }; 
 
});

私のhtml:

<div class="container-fluid" set-value-in-color-selection-block="$tbCtrl.containers">

この $時間のうちウィンドウオブジェクトにアクセスします。私は$タイムアウト内のスコープにアクセスすることができません。

どのようにスコープにアクセスしますか?

+0

あなたはlink関数に 'scope'引数を持っています。タイムアウト機能の内部でアクセス可能です。 –

+0

いいえ、私はスコープにアクセスすることができません。 Uncaught ReferenceError:scopeに定義されているエラーがありません。 –

+0

'scope'は' link'の内部でアクセスできますか? –

答えて

0

あなたのディレクティブの現在のスコープの構成によれば、あなたは親スコープ内の変数にスコープを結合するために、角度語っています。変数の名前は、要素属性setValueInColorSelectionBlockの値によって決定されるように設定されています。 setValueInColorSelectionBlockある -

そして、あなたの範囲は、単一のプロパティを持つことになります。

これらの条件が満たされている満たすために、すべての変数と属性要件を確認してください。

すべてが設定されている場合、スコープはリンク機能scope引数を通じてタイムアウト機能内部で使用可能です。


編集

scopeがタイムアウト関数内で参照されると、クロージャが作成されます。このクロージャは、呼び出し元関数が残っていてもローカル変数に引き続きアクセスできるようにします。

ここでは、scopeオブジェクトがクロージャによって保証されているにもかかわらず、そのプロパティがタイムアウト関数の実行時に削除される可能性があるという問題があるようです。

おそらくscopeオブジェクトのコピーを取り、後でアクセスするためのローカル関数スコープに保存することができます。閉鎖のための@Charlie Hの答えと同様に

link:function(scope, element, attrs) { 

      var savedScope = angular.copy(scope); 

      $timeout(function() { 
       console.log(savedScope); 
      }); 

     } 
+0

こんにちはCharlie H.私はHTMLを追加しました。スコープにアクセスできます。リンク関数内のsetValueInColorSelectionBlockですが、スコープがクリアされた(つまり、スコープが定義されていない)$ timeoutが呼び出されたときの問題です。 $ timeoutの中のコンテキストはウィンドウオブジェクトのものです。 –

+0

編集を提供しました。それがあなたの問題を解決するかどうか確認してください。そうでない場合、小さなフィドルを作成してその状態を示す。 –

+0

こんにちはチャーリー。私は変な問題があります。私がsavedScopeをいくつかの文字列として入れると、$ timerOutクロージャのスコープにアクセスできますが、スコープにはアクセスできません。 fir angular.copy()として。 Scopeインスタンスのコピーは作成できません。 –

0

。あなたはこれを試すことができます$timeoutにパラメーターとユーザーのパラメーターを持つ関数を$timeoutにラップします。

function(eleScope){ // wrapper function with eleScope as parameter 
      $timeout(function() { 
       console.log(eleScope); // access eleScope paramter 
     })(scope); // pass scope to closure function 
    } 
} 
関連する問題