плагин проверки jquery, условный удаленный вызов не работает должным образом

0

Я пытаюсь настроить условный удаленный вызов с помощью стандартного плагина проверки jQuery.

Проблема в том, что когда я передаю имя.val() в методе проверки, оно всегда является именем, которое было установлено во входном текстовом поле при загрузке страницы. Это никогда не имя в текстовом поле.

Я заменил имя.val() на "Test", а затем скрипт работает безупречно. В консоли нет синтаксических ошибок или ошибок. Я также удалил вызов get_exists_rule (name.val()) и заменил его на простое обязательное: true, и это нормально. У меня есть эта настройка, работающая с другими формами с одинаковой схемой именования, без удаленных вызовов.

Я также бросил оповещение в get_exists_rule и независимо от того, что он запускается только один раз, когда загружается страница, поэтому может произойти смешное дело.

Я застрял на этом почти до 7 часов подряд, я посмотрел на каждую связанную с ним должность и везде, о которой я мог думать, и не нашел решения, которое работает.

Здесь кофейник:

  name = $("#category_name")

  get_exists_rule = (category_name) ->
    if original_name is category_name
      required: true
      maxlength: 64
    else
      remote: { url: "/dashboard/categories/exists/" + title_to_slug(category_name), type: "POST", async: false }

  category_form.validate
    errorElement:
      "span"
    rules:
      "category[name]":
        get_exists_rule(name.val())

Здесь javascript:

var get_exists_rule, name;

name = $("#category_name");

get_exists_rule = function(category_name) {
  if (original_name === category_name) {
    return {
      required: true,
      maxlength: 64
    };
  } else {
    return {
      remote: {
        url: "/dashboard/categories/exists/" + title_to_slug(category_name),
        type: "POST",
        async: false
      }
    };
  }
};

category_form.validate({
  errorElement: "span",
  rules: {
    "category[name]": get_exists_rule(name.val())
  }
});
Теги:
coffeescript
jquery-validate

1 ответ

2
Лучший ответ

Выполните начальное правило так же, как и для category_name === original_name. Затем, когда category_name изменяется, добавьте удаленное правило.

Что-то вроде этого:

$('#category_name').on('change', function() {
  $( "#category_name" ).rules( "add", {
    remote: {
      url: "/dashboard/categories/exists/" + title_to_slug(category_name),
      type: "POST",
      success: function(exists) {
        if(title_to_slug(category_name) === original_name) {
          return true;
        else {
          return exists;
        }
      }
    }
  });
});

РЕДАКТИРОВАТЬ

Решение, использующее правило удаленного валидатора по умолчанию вместо добавления правила при изменении.

rules: {
  "category[name]": {
    required: true
    maxlength: 64
    remote: {
      url: "/dashboard/categories/valid_category",
      type: "POST",
      data: {
        "category[name]": function() { 
           return title_to_slug(name.val());
        },
        original_name: original_name
      }
    }
  }
}

На стороне сервера сделайте что-то подобное на своем языке: вам нужно вернуть строку json "true" или "false".

if (post["category[name]"] == original_name)
  return "true"
else 
  return category_exists(post["category[name]"])
  • 0
    Это почти работает, я изменил его, чтобы присоединить к событию "отправить" формы, чтобы он был менее спам. Новая проблема, скажем, я делаю эти шаги: 1. изменить категорию на имя, которое, как я знаю, существует, затем оно правильно выдает мне сообщение об ошибке, 2. изменить категорию на правильное имя, оно все равно дает сбой, но затем если я вернусь и поменяю его снова и переключу поля / вернусь, он пропустит меня. Мысли о том, как исправить это поведение? Действительно ценю помощь, кстати. То же самое относится и к тому, что я помещаю его в событие изменения / размытия поля. Оно также не срабатывает, если все время пытаться отправить его с исходным именем.
  • 0
    Где вы устанавливаете оригинальное имя? Вы уверены, что это не меняется?
Показать ещё 11 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню