在angularjs中使用自定义指令时难以访问$scope
我已经声明了一个自定义指令来检查angularjs中用户的存在性在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.
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);
});
});