Quiero pasar a la salida de un bloque de código javascript en html para su correspondiente componente de la peatonal. Traté de AbstractDefaultAjaxBehaviour y no parece funcionar.

Aquí es lo que estoy trabajando:

HTML

//In <body>
<div wicket:id="container">
<script type="text/javascript" wicket:id="channelScript">

  function initChannel() {
    window.alert('got it');
  }

</script>
</div>

private WebMarkupContainer container = new WebMarkupContainer("container");
private Label channelScript = new Label("channelScript", "initChannel();");

add(container);
final AbstractDefaultAjaxBehavior channel = new AbstractDefaultAjaxBehavior() {
    protected void respond(final AjaxRequestTarget target) {
    channelScript.setEscapeModelStrings(false);
        target.add(channelScript); //initChannel is not triggerred
    }
};
container.add(channel);

También probé esto:

add(new AjaxEventBehavior("onload") {
  @Override
  protected void onEvent(AjaxRequestTarget target) {
    channelScript.setEscapeModelStrings(false);
    target.add(new Label(channelScript));
  }
}

Por favor, ¿qué estoy haciendo mal? Gracias

ACTUALIZACIÓN

Voy a estar pasando serie de variables a partir de la peatonal a la JS de tal forma que cada javascript salida se muestra el uso de la peatonal de componente. Me acabo de dar cuenta que voy a tener que hacer con dom estado de listo para comenzar la interacción. Así que está bien. Pero entonces todavía estoy confundido y desorientado acerca de cómo el wicket componente de cambio de estado para recibir actualizado respuesta de javascript. Hay un postigo componente que activa a sí mismo de forma asincrónica?

InformationsquelleAutor drecute | 2012-02-12

3 Comentarios

  1. 5

    No utilice una Etiqueta de secuencia de comandos de contenedor. Wicket tiene algunas formas de hacerlo.
    El código siguiente sería la opción (suponiendo que esté en la peatonal de 1,5)

        @Override
    public void renderHead(final Component component, final IHeaderResponse response)
    {
        super.renderHead(component, response);
    
        response.renderJavaScript("initChannel();", "myScriptID");
    }

    Si quieres realizar una secuencia de comandos después de que el sitio fue completamente cargada, puede usar este:

    response.renderOnLoadJavaScript("doSomething();");

    En la peatonal de 1.4 este funciona de manera diferente. Usted tiene que usar HeaderContributors allí.

    • He probado esto. Funciona. Al parecer, yo quiero que el código javascript en el lugar (dentro del cuerpo html) y no en la cabeza. De tal manera que cuando necesito pasar variables entre JS y Java a través de wicketAjaxGet, puedo obtener el derecho existe (que yo.e en el postigo componente es agregado).
    • No puede usted definir el JS en la cabeza y lo llaman en el lugar donde desea que el código?
    • ¿Cómo puedo hacer eso? Tener el javascript se ejecute en la carga no es un problema. Tener un componente para ejecutar de forma asincrónica en la carga y la recuperación de valor de javascript es lo que yo estoy teniendo problemas con el. Supongo que esto es lo AjaxEventBehavior está destinado. Pero no funciona para mí.
    • tal vez esto puede ayudarle a: http://stackoverflow.com/questions/7993626/wicket-1-5-javascript-file-in-body-tag
  2. 1

    Estás haciendo mal porque se establece un wicket:id en su <script> parte, por tanto, de la Peatonal de la reemplazará con su Label‘s contenido (la función de javascript llamada). Su función javascript nunca está disponible, porque nunca es enviado al cliente. La «buena» manera de hacer lo que se quiere es quitar el wicket:id de su etiqueta de secuencia de comandos y en su comportamiento, utilice el método especial target.appendJavascript("initChannel();"); (o prependJavascript) en lugar de jugar con escapar en un Label.

    Por favor, tenga en cuenta que su primer método nunca puede funcionar si usted nunca «fuego», el ajax de comportamiento, el segundo debe trabajar cuando el navegador se ha terminado de cargar el DOM y desencadenar la «onload» del evento en su página (pero no estoy seguro de que el comportamiento está correctamente acabado, nunca se trató de esto…)

    Una nota adicional es que el Javascript que escribió está contaminando el espacio de nombres global de la ventana, si considerar el uso de este en un proyecto real, por favor considere la lectura de la documentación relativa a las namespacing de javascript.

    • Gracias. A qué componente debo agregar target.appendJavascript("initChannel()") a? También, ¿cómo puedo fuego el ajax en el comportamiento? ¿Cómo AjaxRequestTarget busque la función js? Lo siento, estoy un poco bajo una ilusión debida a las horas de intentar comprender lo que está pasando.
    • Para entender cómo las cosas deberían funcionar sugiero poner un AjaxLink en su página y en el onClick método de añadir el código JavaScript llamada que desea probar.
    • OK. Que parece funcionar. ¿Qué pasa si yo no necesito evento onClick. En realidad no necesito de un evento. Sólo quiero que el js anexa al formato html. Puede usted decirme por qué algo como esto no funciona: AbstractDefaultAjaxBehaviour behave = new AbstractDefaultAjaxBehaviour() { protected void respond(AjaxRequestTarget target) { target.appendJavascript("alert('hey');")}}; add(behave); porque creo que no está adherido a ningún código html?
    • Básicamente, usted necesita algo para activar el comportamiento que adjunto a la componente. Si usted sólo desea ejecutar el código javascript en la página de carga, usted ni siquiera necesita para adjuntar un comportamiento y usted puede simplemente hacer que el uso de un simple javascript (adjuntar un dom función ready).
    • Una carga de la página, podría simplemente utilizar un cierre de función – que funcionó cuando lo probé. Como mencioné en uno de mis comentarios, necesito el código JS en el cuerpo de html dentro de las etiquetas html. Necesito el JS variables a estar disponible en el lugar exacto donde el wicket componente añadido.
    • No estoy seguro de que he entendido todo lo que quieras hacer, pero creo que se pueden pasar variables de javascript llamadas de método. Por favor refinar la pregunta de si me quieres contestar con más precisión.

  3. 1

    He estado trabajando en un Wicket 6 extensión llamada wicket-js que le permite hacer esto de una manera muy cómoda y limpia.

    Código para el caso de uso podría ser algo como esto

    add(new JsBehavior() {
        @Override
        protected IJavaScript domReadyJs() {
            return new JsCall("initChannel");
        }
    });

    que se traduce en lo que @Hasta que ya ha proporcionado como un nativo de la Peatonal de solución.


    Si quieres la alert allí usted puede hacer esto

    add(new JsBehavior() {
        @Override
        protected IJavaScript domReadyJs() {
            return new JsStatements(
                new JsCall("alert", "got it"),
                new JsCall("initChannel")
            );
        }
    });

Dejar respuesta

Please enter your comment!
Please enter your name here