Кнопка JSF отключена, когда textarea пуст, обновляйте каждое изменение с помощью ajax? [Дубликат]

Это все в «волшебном» синтаксисе вызова метода:

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));
4
задан BalusC 14 December 2015 в 17:56
поделиться

1 ответ

Повторное включение блокировки на стороне сервера с помощью 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 из кнопки по причинам, описанным выше.

5
ответ дан Community 23 August 2018 в 00:00
поделиться
  • 1
    удалив отключенный атрибут, он сработал. действие вызывается сейчас. раньше в исходном представлении страницы я мог видеть только onClick = & quot; return false; & quot; для командной кнопки. теперь его значение выглядит так: onclick = & quot; jsf.util.chain (это событие, & amp; quot; return true; & amp; quot; & quot; RichPaces.ajax (\ & amp; quot; noteSubmitButton \ & amp; quot; quot; , событие, {\ & amp; quot; incId \ & amp; quot; \ & amp; quot; 1 \ & amp; quot;}) & amp; quot;); return false; & quot; – Walker 22 January 2014 в 12:00
  • 2
    я мог бы сделать ajax, используя & lt; f: ajax event = & quot; keyup & quot; & GT; также, но я видел, что круг обработки на каждой клавиатуре, что может помешать пользователю при добавлении заметок. с использованием & lt; f: ajax event = "change & quot; & GT; привело к включению / отключению кнопки только после того, как пользователь щелкнул по компоненту текстовой области ввода, поэтому он не выглядел динамичным. Следовательно, идет с javascript образом. – Walker 22 January 2014 в 12:02
Другие вопросы по тегам:

Похожие вопросы: