语义 UI 和 Meteor JS:在不更改页面的情况下验证表单

Semantic UI and Meteor JS: Validating Form Without Changing Page

我有一个语义-ui形式:

<form class="ui form">
  <div class="ui form segment">
    <div class="ui field">
            <label>Enter New Category Name</label>
      <div class="ui input">
        <input type="text" placeholder="Category Name" id="category-name-input">
      </div>
    </div>

    <div class="ui submit button" id="add-category-btn">
    ADD CATEGORY
    </div>

  </div>
</form>

我使用此表单在我的页面上输入新类别。 当我单击具有唯一名称的提交按钮时,表单通过了验证,我可以将该新类别名称插入到我的 MONGO 数据库数据库中:

var settings = {
  inline: true,
  revalidate: true,
  //on: 'blur',
  onFailure: function(){
        console.log('failed validation');
        return false;
    },
  onSuccess:function(e){
    console.log("onSuccess");
    e.preventDefault;

    ProductCategories.insert({category_name : editedText});
    return false;
  }
};

这是我第一次在不更改页面的情况下使用语义-UI 表单。 这一次,我使用 semantic-ui 验证来确保输入的类别名称是唯一的(因此还不在数据库中)并确保它不是空的。 如果我输入一个唯一的名称,然后单击提交按钮。它通过了验证。 然后它调用 onSuccess 回调,并将类别名称插入 MONGO DB 数据库,因为 Meteor 是响应式的,页面会自行更新并显示新类别。

我的问题是调用 onSuccess 回调后,Semantic-UI 似乎再次验证了表单。这使我处于错误消息不应该再次显示的情况。 我陷入了这种情况....如果我什么都不做,只是将输入字段的值保留为单击时的值,那么这次验证会再次根据数据库中的值检查该值,并且它使表单无效,因为该值不再是唯一的(因为它刚刚被插入)。 当调用 onSuccess 时,我可以选择再次将该输入字段设为空。但如果我这样做,语义 UI 会抱怨该字段是空的,它不应该是空的。

理想情况下,我想在 onSuccess 回调中写一些东西来告诉 semantic-ui 它已经完成了验证工作,这就是它达到 onSuccess 的原因,请不要' T REVALIDATE 因为它会显示我不想显示的错误消息.....

我试过:

$('form').form('clear')

$('form').form('reset')

onSuccess 中,但我发现验证发生在 onSuccess 之后,因此重置表单或清除表单只会使字段为空并且语义-ui 表单抱怨该字段没有值。

有办法解决这个问题吗? 有什么解决办法?

非常感谢

我不确定它是否有帮助,但 preventDefault 是函数,不是 属性:

e.preventDefault();

我在表单验证方面遇到了类似的问题。即在重新验证表单后,即使验证正确,它仍然会出现错误消息。

出现问题是因为尽管您使用

清除并重置了表单
$('form').form('clear')
$('form').form('reset')

表单 ui-消息 class 仍将如下所示(即仍然包含“.error”class):

<div class="ui error message">

在表单验证时触发错误消息之前,它看起来类似于:

<div class="ui message">

请注意,在触发表单验证错误消息后,“.error”class 被添加到 ui-message.

我解决这个问题的方法就是使用 jquery 从 ui-message 中删除“.error”class。这可能是一个 hack,或者这可能是 quirk 在语义-ui 的设计方式中,这种行为没有正确记录?

这里有一小段代码可以演示我解决问题的方法。首先是模态设置,然后是 resetForm() 函数以防止错误消息再次出现。

$('.ui.modal.candEntry').modal({
                onShow: function () {
                    $('#email').val(val.emailSearch);  // set the email on modal
                },
                onHide: function () {
                    resetForm();
                },
                onApprove: function () {
                    var ok = validateCandidateModal();
                    if (ok) {
                        Session.set('updateJobAlert', false);
                        var modalContents = $('.candAdd').form('get values');
                        // add the record to DB
                        var result = Meteor.call('insertCandidate', modalContents);
                        console.log('meteor insert '+result);
                        Router.go('somewhere', { email: modalContents.email } );
                    }
                    return ok
                },
                transition: 'horizontal flip'
            }).modal('show');

防止错误消息返回验证成功的方法...

function resetForm() {
var candAdd = $('.candAdd');
candAdd.form('reset');
candAdd.form('clear');
// remove the error class so it wont show error msg ( semantic-ui bug ? )
candAdd.removeClass('error');

}

好的...我找到了一些有用的东西。

function resetForm(){
  console.log('inside resetForm');

  $('.ui.form').form('clear');
  $('.ui.form').form('reset');
  $('.error').removeClass('error');
}

然后在 onSuccess 里面:

var settings = {
  inline: true,
  //revalidate: true,
  //on: 'blur',
  onFailure: function(){
        console.log('failed validation');
        return false;
    },
  onSuccess:function(e){
    console.log("onSuccess");
    e.preventDefault();

    ProductCategories.insert({category_name : editedText});

    setTimeout(resetForm, 50);

    return true;
  }
};