Это все в «волшебном» синтаксисе вызова метода:
object.property();
Когда вы получаете свойство из объекта и вызываете его за один раз, объект будет контекстом для метода , Если вы вызываете тот же метод, но в отдельных шагах, контекст представляет собой глобальную область (окно):
var f = object.property;
f();
Когда вы получаете ссылку на метод, он больше не привязан к объекту, это просто ссылка на простую функцию. То же самое происходит, когда вы получаете ссылку на использование в качестве обратного вызова:
this.saveNextLevelData(this.setAll);
Здесь вы привязываете контекст к функции:
this.saveNextLevelData(this.setAll.bind(this));
Если вы используете jQuery вы должны использовать метод $.proxy
, а bind
не поддерживается во всех браузерах:
this.saveNextLevelData($.proxy(this.setAll, this));
Повторное включение блокировки на стороне сервера с помощью JavaScript действительно никогда не будет работать. При обработке формы submit JSF проверит атрибут disabled
еще раз перед созданием и очередью события события. Это делается как часть защиты от несанкционированных / взломанных запросов (представьте, что кнопка команды отключена, когда пользователь не является администратором сайта, такая кнопка абсолютно не должна быть разрешена только с помощью кода JavaScript, который конечный пользователь имеет полный контроль над ).
В вашем случае disabled="#{bean.disabled}"
все еще оценил true
в тот момент, заставив кнопку эффективно отключиться во время обработки формы submit и, таким образом, событие действия не будет поставлено в очередь и метод действия выиграл Не будет вызвано. Это также упоминается как точка №5 из commandButton / commandLink / ajax action / listener метод не вызывается или входное значение не обновляется .
Что вы должны делать? Просто включите кнопку JSF вместо JavaScript. Пусть вместо атрибута disabled
проверьте, пустое или нет входное значение.
<h:inputTextarea value="#{bean.input}" ...>
<f:ajax event="keyup" delay="200" render="buttonId" />
</h:inputTextarea>
<h:commandButton id="buttonId" ... disabled="#{empty bean.input}" />
delay="200"
заключается в том, чтобы избежать попадания сервера на поток аякс-запросов, по одному на каждый напечатанный символ.
Или, сначала отключите кнопку JavaScript вместо JSF. У вас уже есть правильный скрипт для этого на месте, однако ему не хватает идентификатора формы, что может привести к его неработоспособности (использование <h:form prependId="false">
- это неправильная практика, вы не должны этого делать).
<h:form id="formId">
...
<h:commandButton id="buttonId" ... /> <!-- Note: no JSF disabled attribute! -->
</h:form>
<script>
document.getElementById("formId:buttonId").disabled = true;
</script>
Не забудьте удалить атрибут JSF disabled
из кнопки по причинам, описанным выше.