我正在尝试检查表单中用户提供的网址是否有效,即服务器的响应是否为200.
我想在用户在字段中键入内容以及何时失去焦点时运行检查。由于原始策略相同,我在服务器端运行检查:
客户端代码:
// test url when input loses focus
angular.element(document).ready(function () {
$('#target_url').focusout(function() {
if ($('#target_url').hasClass('ng-dirty')){
$http.post('/test-url', { target_url: scope.newJob.target_url }).success(function(response){
if (response === 'valid url'){
console.log('valid url');
}else{
console.log('url not valid');
}
});
};
});
});
服务器端:
// url testing route
app.post('/test-url', function(req, res) {
request(req.body.target_url, function (err, response) {
if (response && response.statusCode === 200) {
res.send('valid url');
}else{
res.send('url not valid');
}
})
});
我的问题是,当我失去焦点时,响应不会打印到控制台,但只有当我开始在另一个输入中输入内容时。我做错了什么?
注意:我使用的是角度1.1.5,这就是为什么我没有使用' ng-focus'
答案 0 :(得分:1)
简短回答:您需要将focusout
回调包裹在$scope.$apply
。
答案很长:$.focusout
是jQuery并且在Angular的摘要周期之外运行。因此,Angular不会使摘要结束信号触发$http.post
。当您键入其他字段时,摘要周期将完成,最后$http.post
将触发。
建议更正:
$('#target_url').focusout(function() {
$scope.$apply(function() {
...existing code here...
});
});