Выполнение управляемой функции Bean в Javascript [дубликат]

Если вы используете maven для создания своего приложения, это не правильный способ добавить внешнюю библиотеку. Вы должны либо

  1. Сделайте установку своей библиотеки, как показано ниже mvn install:install-file -Dfile=myJar.jar -DgroupId=com.yourproject -DartifactId=yourproject -Dversion={version} -Dpackaging=jar.
  2. Используйте системный путь, как описано здесь здесь .

Вариант 1 предпочтительнее, так как вам не нужно держать банку в своем проекте.

11
задан BalusC 28 May 2013 в 13:02
поделиться

1 ответ

Несколько способов.

  1. Используйте трюк «скрытой формы» (на самом деле, «взломать» придает уродство лучшую формулировку).
    <h:form id="form" style="display:none;">
        <h:commandButton id="button" action="#{bean.action}">
            <f:ajax render=":results" />
        </h:commandButton>
    </h:form>
    <h:panelGroup id="results">
        ...
    </h:panelGroup>
    
    Вы можете вызвать его в JS, как показано ниже:
    document.getElementById("form:button").onclick();
    
    Обратите внимание на важность запуска onclick() вместо click() в случае <h:commandButton>. onclick() немедленно вызывает функцию onclick, в то время как click() запускает событие «щелчок» на элементе, которое не поддерживается в IE. Если вы использовали <h:commandLink>, вы можете безопасно использовать click(). Чтобы вызвать его во время события load, рассмотрите вопрос о его включении в <h:outputScript target="body">. target="body" автоматически помещает <script> в конец <body>, поэтому обертка $(document).ready() не нужна.
    <h:outputScript target="body">
        document.getElementById("form:button").onclick();
    </h:outputScript>
    
  2. Поскольку вы уже используете PrimeFaces, просто используйте его <p:remoteCommand> .
    <h:form>
        <p:remoteCommand name="commandName" action="#{bean.action}" update=":results" />
    </h:form>
    <h:panelGroup id="results">
        ...
    </h:panelGroup>
    
    Вы можете вызвать его в JS, как показано ниже:
    commandName();
    
    Это, однако, не использует JSF native jsf.ajax.request() , вместо этого использует собственный jQuery из PrimeFaces (вы знаете, PrimeFaces является библиотекой компонентов JSF поверх jQuery / UI). Чтобы вызвать его во время события load, установите autoRun="true".
    <p:remoteCommand ... autoRun="true" />
    
  3. Создайте пользовательский UIComponent, который расширяет UICommand и генерирует необходимый JSF-вызов jsf.ajax.request(). Вы тогда по сути изобретаете <p:remoteCommand>, чтобы использовать собственный JSF ajax вместо jQuery. Библиотека утилиты JSF OmniFaces имеет компонент <o:commandScript>, который выполняет именно это. См. Также демонстрацию и исходный код .
    <h:form>
        <o:commandScript name="commandName" action="#{bean.action}" render=":results" />
    </h:form>
    <h:panelGroup id="results">
        ...
    </h:panelGroup>
    
    Вы можете вызвать его в JS, как показано ниже:
    commandName();
    
    Чтобы вызвать его во время события load, установите autorun="true".
    <o:commandScript ... autorun="true" />
    
  4. Обновите JSF 2.3 и используйте собственный компонент <h:commandScript>. Он доступен с 2.3.0-m06 . Синтаксис точно такой же, как и выше <o:commandScript>. Просто замените o: на h:.
19
ответ дан BalusC 22 August 2018 в 09:03
поделиться
  • 1
    Спасибо BalusC! Проблема была решена с помощью вашего варианта secound, используя компонент remoteCommand, теперь он работает на 100%! – Tiago Vieira Dos Santos 16 May 2013 в 15:22
Другие вопросы по тегам:

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