范围包含值,但在访问它时,它是未定义的

时间:2016-05-29 16:19:16

标签: javascript angularjs angularjs-directive

我正在编写AngularJS指令,当我尝试访问范围变量时,它是undefined。如果我打印出scope,我可以清楚地看到该变量有一个值。

检查你的JavaScript控制台,这就是我打印这些内容的地方。

这是一个Plunker事:http://plnkr.co/edit/1cSVZJgtlUazOqTuCNOK

1 个答案:

答案 0 :(得分:2)

这是因为在编译<form>时,尚未编译提供form值的usernameAvailable指令,因为它显然是form的子范围{1}}。您在使用usernameAvaiable时看到console.log()值的原因是因为它打印了$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();
              }
            });
          }
        };  
      });

    }
  }
}]);