我的directive
有form
,其模板包含两个text fields
。可以使用textfield
(number
)填写第一个id
。只要focus
中field
丢失,就会GET
完成id
,并在第二个text field
中填写validation
的相应名称。填写数据库中不存在的数字(找不到名称)时,该字段的false
将为GET
。
我遇到的问题是,当你填写错误的数字(例如-1)并直接点击“保存”按钮时,我的表格将在Ajax
电话和我的指令之前提交将有效而非无效。
有没有办法让函数等待指令完成其$timeout
调用或类似的事情?
我尝试了0
$values
延迟,在队列末尾放置我的函数调用(从按钮开始),但仍然无法解决我的问题。
答案 0 :(得分:1)
$asyncValidators
提供了您想要的内容,ngModelController
是$asyncValidators
的一部分。他们拒绝确认等待承诺的解决。
来自文档:
$pending
预期的验证集合 执行异步验证(例如HTTP请求)。提供的验证功能 在模型验证过程中运行时,预计会返回一个承诺。一旦承诺 如果已交付,则验证状态将在满足时设置为true,在拒绝时将设置为false。 触发异步验证器时,每个验证器将并行运行并与模型一起运行 只有在满足所有验证器后才会更新值。只要一个异步验证器 如果未实现,其密钥将添加到控制器4xx
属性中。此外,所有异步验证器 只有在所有同步验证器都通过后才会运行。请注意,如果使用$ http,则服务器返回成功的HTTP响应代码以完成验证和状态级别
ngModel.$asyncValidators.uniqueUsername = function(modelValue, viewValue) { var value = modelValue || viewValue; // Lookup user by username return $http.get('/api/users/' + value). then(function onFulfilled() { //username exists, this means validation fails //throw to reject promise throw 'exists' // }, function onRejected() { //username does not exist, therefore this validation passes return true; }); };
以拒绝验证非常重要。
- AngularJS ngModelController API Reference -- $asyncValidators。
[HttpPost]
public ActionResult LockUser(string Id)
{
var datastore = new UserStore<ApplicationUser>();
var manager = new UserManager<ApplicationUser, string>(datastore);
//update current user object in memory
//var user = User.Identity.GetApplicationUser();
var user = manager.FindById(Id);
user.LockoutEnabled = true;
user.LockoutEndDateUtc = DateTime.UtcNow.AddYears(2);
manager.UpdateAsync(user);
var dbcontext = datastore.Context;
//update user object in database
dbcontext.SaveChanges();
return RedirectToAction("Index");
}