2016-05-29 10 views
2

私はAngularJSディレクティブを作成していますが、スコープ変数にアクセスしようとするとundefinedになります。 scopeを印刷すると、その変数に値があることがはっきりと分かります。スコープには値が含まれていますが、アクセスすると定義されていません

JavaScriptのコンソールを確認してください。ここではこれを印刷しています。

はここPlunkerのことだ:http://plnkr.co/edit/1cSVZJgtlUazOqTuCNOK

+0

、3つのすべての段階で未定義として'各ログ・コールの前にブレークポイントは 'scope.usernameAvailable'を示しています。 – C14L

+0

問題は、コンソールにjavascriptオブジェクトを記録すると、オブジェクトを展開した後にのみデータがキャプチャされるということです。 'console.log(Object.assign({}、scope));}を試してください。それは未定義です。 – Schlaus

答えて

2

usernameAvailableがコンパイルされたとき、それはformの子スコープが明確であるため、form値の値を提供し<form>ディレクティブは、まだコンパイルされていないためです。 console.log()を使用するときにusernameAvaiableの値が表示されるのは、$scopeオブジェクトのreference(これは最新の値を意味します)を出力するためです。このような値に実際にアクセスしたい場合は、回避策として$timeout()を使用して値にアクセスします。 `デバッガの設定

DEMO

app.directive('usernameAvailable', ['$http', '$q', '$timeout', function($http, $q, $timeout) { 
    return { 
    restrict: 'A', 
    require: 'ngModel', 
    scope: { 
     usernameAvailable: '=' 
    }, 
    link: function(scope, elem, attr, controller) { 
     $timeout(function() { 
     scope.usernameAvailable.$asyncValidators.usernameAvailable = function(username) { 
      if (typeof(getCurrentUsername) != 'undefined' && username == getCurrentUsername()) { 
      return $q.resolve(); 
      } else { 
      return $http.get('/user/usernameAvailable?username=' + username).success(function(result) { 
       if (result) { 
       return $q.resolve(); 
       } else { 
       return $q.reject(); 
       } 
      }); 
      } 
     }; 
     }); 

    } 
    } 
}]); 
関連する問題