Это фактически не имеет ничего общего с значениями по умолчанию, кроме того, что часто возникает неожиданное поведение при записи функций с изменяемыми значениями по умолчанию.
>>> def foo(a):
a.append(5)
print a
>>> a = [5]
>>> foo(a)
[5, 5]
>>> foo(a)
[5, 5, 5]
>>> foo(a)
[5, 5, 5, 5]
>>> foo(a)
[5, 5, 5, 5, 5]
В этом нет значений по умолчанию код, но вы получаете точно такую же проблему.
Проблема в том, что foo
является изменением изменчивой переменной, переданной от вызывающего, когда вызывающий объект не ожидает этого , Код, подобный этому, был бы хорош, если бы функция была вызвана как-то вроде append_5
; то вызывающий абонент будет вызывать функцию, чтобы изменить значение, которое они передают, и поведение будет ожидаться. Но такая функция вряд ли примет аргумент по умолчанию и, вероятно, не вернет список (поскольку у вызывающего уже есть ссылка на этот список, тот, который он только что передал).
Ваш оригинал foo
с аргументом по умолчанию не должен изменять a
, был ли он явно передан или получил значение по умолчанию. Ваш код должен оставлять изменчивые аргументы отдельно, если из контекста / имени / документации не ясно, что аргументы должны быть изменены. Использование измененных значений, передаваемых в качестве аргументов, таких как локальные временные файлы, является крайне плохой идеей, независимо от того, находимся ли мы на Python или нет, и есть ли задействованные аргументы по умолчанию.
Если вам нужно разрушить локальное временное в процессе вычисления чего-то, и вам нужно начать свою манипуляцию из значения аргумента, вам нужно сделать копию.
Автор плагина говорит, что вы должны использовать квадратные скобки без кавычек , []
http://bassistance.de/2011/10/ 07 / release-validation-plugin-1-9-0 /
Release: Validation Plugin 1.9.0: «... Еще одно изменение должно сделать установку форм со скрытыми Элементы проще, теперь они игнорируются по умолчанию (опция «ignore» теперь имеет значение «: hidden» по умолчанию). Теоретически это может нарушить существующую настройку. В маловероятном случае, что это действительно так, вы можете исправить это, установив ignore-option to "[]" (квадратные скобки без кавычек).
blockquote>Чтобы изменить эту настройку для всех форм:
$.validator.setDefaults({ ignore: [], // any other default options and/or rules });
(Это не что
.setDefaults()
находится внутри функцииdocument.ready
)ИЛИ для одной конкретной формы:
$(document).ready(function() { $('#myform').validate({ ignore: [], // any other options and/or rules }); });
EDIT:
См. этот ответ о том, как включить проверку некоторых скрытых полей, но все равно игнорировать другие.
EDIT 2:
Перед тем как оставить комментарии, что " это не работает », продолжайте в виду, что OP просто спрашивает о плагине jQuery Validate , и его вопрос не имеет никакого отношения к тому, как ASP.NET, MVC или любая другая инфраструктура Microsoft могут изменить нормальное ожидаемое поведение этого плагина. Если вы используете фреймворк Microsoft, функционирование плагина jQuery Validate по умолчанию перезаписывается плагином Microsoft
unobtrusive-validation
.Если вы боретесь с плагином
unobtrusive-validation
, пожалуйста, обратитесь вместо этого: https://stackoverflow.com/a/11053251/594235
Итак, я собираюсь немного глубже понять, почему это не работает, потому что я такой человек, который не может спать по ночам, не зная ха-ха. Я использую jQuery validate 1.10 и Microsoft jQuery Unobtrusive Validation 2.0.20710.0, который был опубликован в 1/29/2013.
Я начал с поиска метода setDefaults в jQuery Validate и нашел его в строке 261 unminified file. Вся эта функция действительно объединяет ваши настройки json в существующие $.validator.defaults
, которые инициализируются с использованием свойства ignore, которое установлено как «: hidden», а также другие значения по умолчанию, определенные в jQuery Validate. Поэтому в этот момент мы переопределили игнорирование. Теперь давайте посмотрим, на что ссылается это свойство по умолчанию.
Когда я прорисовывал код, чтобы увидеть, где ссылается $.validator.defaults
. Я заметил, что это используется только конструктором для валидатора формы, строка 170 в jQuery проверяет unminified файл.
// constructor for validator
$.validator = function( options, form ) {
this.settings = $.extend( true, {}, $.validator.defaults, options );
this.currentForm = form;
this.init();
};
На этом этапе валидатор объединит все установленные по умолчанию настройки, которые были установлены и прикреплены к валидатору формы. Когда вы смотрите на код, который выполняет проверку, подсветку, подсвечивание и т. Д., Все они используют объект validator.settings, чтобы вытащить свойство ignore. Поэтому нам нужно убедиться, что мы должны установить игнорирование с помощью метода setDefaults, тогда он должен произойти до $ («form»). Вызывается функция validate ().
Если вы используете Asp .net MVC и ненавязчивый плагин, тогда вы поймете, посмотрев на javascript, который validate вызывается в документе .ready. Я также назвал свои setDefaults в блоке document.ready, который будет выполняться после скриптов, jquery проверяет и ненавязчив, потому что я определил эти сценарии в html перед тем, у кого есть вызов в нем. Таким образом, мой вызов, очевидно, не повлиял на функциональность по умолчанию пропуска скрытых элементов во время проверки. Здесь есть пара вариантов.
Вариант 1 - Вы могли бы, как указал Хуан Мелладо, вызвать вызов за пределами документа. Уже выполнив его, как только скрипт будет загружен. Я не уверен в сроках этого, так как браузеры теперь могут выполнять параллельную загрузку скрипта. Если я просто буду осторожен, то, пожалуйста, поправьте меня. Кроме того, возможно, есть способы обойти это, но для моих нужд я не пошел по этому пути.
Вариант 2a - Безопасная ставка в моих глазах - просто заменить $.validator.setDefaults({ ignore: '' });
внутри события document.ready с $("form").data("validator").settings.ignore = "";
. Это изменит свойство ignore, которое фактически используется проверкой jQuery при выполнении каждой проверки на ваших элементах для данной формы.
Параметры 2b - После просмотра кода немного больше вы также можете использовать $("form").validate().settings.ignore = "";
как способ установки свойства ignore. Причина в том, что при просмотре функции validate он проверяет, был ли объект-валидатор уже сохранен для элемента формы с помощью функции $.data()
. Если он находит объект валидатора, хранящийся в элементе формы, он просто возвращает объект validator вместо создания другого.
Это работало для меня на сайте ASP.NET. Чтобы включить проверку в некоторых скрытых полях, используйте этот код
$("form").data("validator").settings.ignore = ":hidden:not(#myitem)";
Чтобы включить проверку для всех элементов формы, используйте эту $("form").data("validator").settings.ignore = "";
. Обратите внимание: используйте их в $(document).ready(function() { })
Просто добавленный ignore: []
на конкретную страницу для конкретной формы, это решение сработало для меня.
$("#form_name").validate({
ignore: [],
onkeyup: false,
rules: {
},
highlight:false,
});
Обязательно установите
$.validator.setDefaults({ ignore: '' });
НЕ внутри $(document).ready
$.validator.setDefaults()
внутри или снаружи готового ручного DOM. Сравните этот jsFiddle с этим jsFiddle .
– Sparky
9 April 2013 в 21:40
Это работало для меня на узле ASP.NET MVC3, где я оставил структуру для настройки ненавязчивой проверки и т. д., если это полезно кому угодно:
$("form").data("validator").settings.ignore = "";
Просто найдите текст ignore: ": hidden" в файле проверки jquery и прокомментируйте его. После комментариев это никогда не потеряет никаких скрытых элементов для проверки ...
Спасибо
Это работает для меня.
jQuery("#form_name").validate().settings.ignore = "";