在angularjs中使用自定义指令时难以访问$scope

在angularjs中使用自定义指令时难以访问$scope,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我已经声明了一个自定义指令来检查angularjs中用户的存在性 var app = angular.module('myApp', []); app.factory('Contestant',function($http){ return { checkUser : function(email){ return $http.post('ajax/checkuser.

我已经声明了一个自定义指令来检查angularjs中用户的存在性

    var app = angular.module('myApp', []);
app.factory('Contestant',function($http){
                return {
                    checkUser : function(email){
                        return $http.post('ajax/checkuser.php',{email:email});
                    }
                }
            });
app.directive('checkUser',function(Contestant) {
    return {
        require: 'ngModel',
        link: function(scope, element, attrs,ctrl) {
            ctrl.$parsers.unshift(function(viewValue) {
            Contestant.checkUser(viewValue).success(function (response) {
                ctrl.$setValidity('checkUser', true);
                return viewValue;
            })
            .error(function (data) {
                ctrl.$setValidity('checkUser', false);
                return undefined;
            });
        });
        }
    }

});
HTML


如何访问sponsorID的值,而在模型上设置输入值之前,使用自定义指令就地解析器解析输入值。例如,
“123”
被添加到输入字段中,但数值
123
被添加到模型中。因此,在我看来,您误用了该特性,并且由于解析器从不返回值,因此您的模型将始终是未定义的

您的
checkUser
返回viewValue,但为时已晚:解析器已经运行,由于缺少return语句,模型将获得未定义的值

快速修复是添加
返回viewValue。但是请注意,在ajax请求完成之前,您的表单将被视为有效。(在调用
checkUser
修复之前,可以将其标记为无效。)

在这种情况下,您不应该使用解析器,只需观察模型即可

scope.$watch(attrs.ngModel, function (val) {
  // Mark the form as invalid until the check is complete
  ctrl.$setValidity('checkUser', false);

  Contestant.checkUser(val).then(function () { 
      ctrl.$setValidity('checkUser', true);
  });
});

您是否尝试通过执行以下操作在指令中设置ngmodel绑定:
scope:{…,ngmodel:'=',…}
解决了该问题。谢谢
app.controller('myController', function($scope, $http, $routeParams) {
console.log($scope.sponsorID);
});
scope.$watch(attrs.ngModel, function (val) {
  // Mark the form as invalid until the check is complete
  ctrl.$setValidity('checkUser', false);

  Contestant.checkUser(val).then(function () { 
      ctrl.$setValidity('checkUser', true);
  });
});