ZK: Wie Komponente anlegen und registrieren databinding

Hallo,

Ich bin mit ZK framework für die Entwicklung von web-Anwendungen. Ich bin mit databinding-Komponenten, set-und get-Werte. Kann ich mich anmelden databinding in Quelle ZUL-Datei und auch in der Methode doAfterCompose in der page-controller. Diese Methode wird aufgerufen, während die Seite Zusammensetzung. Aber jetzt habe ich eine neue Komponente hinzufügen, und es ist databinding in bestehende und komponierte Seite. So erstellen Komponenten-ich weiß, es ist einfach, aber ich habe ein problem, registrieren databinding. Rahmen wirft die exception, dass ich mit unbekannten Daten Bohne.

Gibt es einen einfachen code, der funktionieren sollte aber es funktioniert nicht. Dieser ZUL-Datei beschreibt die einfache Seitenlayouts und der controller fängt Veranstaltungen etc. Es kommen Anmerkungen ZkModel und ZkEvents. Diese Anmerkungen sind nicht Teil des Frameworks ist, sind Sie unsere Verstärkung. ZkModel veröffentlicht die variable ZUL-Datei, damit es zugänglich ist, aus ZUL-Datei mit databinding. ZkEvent Register Ereignisse auf die Komponenten und ruft diese Methoden auf Ereignisse. Diese Verbesserung ist in Arbeit-es ist also nicht das problem.

ZUL-Datei (test.zul):

<?xml version="1.0" encoding="UTF-8"?>
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
<?init class="cz.datalite.zk.databinder.DLDataBinderInit" root="winTest" validator="${validator}"?>
<!-- template -->
<?init class="org.zkoss.zk.ui.util.Composition" arg0="/includes/template.zul"?>
<?page title="Test page"?>

<zk xmlns="http://www.zkoss.org/2005/zul">
    <window id="winTest"  self="@{define(content)}" height="100%" apply="${testController}">
        <button label="OK" id="btn"/>
        <label id="lab" value="text"/>
        <textbox id="txt1" value="@{ctl.bindingValue}"/>
    </window>
</zk>

TestController.java:

package cz.datalite.bpej.evidence;

import cz.datalite.stereotype.Controller;
import cz.datalite.zk.annotation.ZkEvent;
import cz.datalite.zk.annotation.ZkModel;
import cz.datalite.zk.components.textbox.DLTextbox;
import cz.datalite.zk.composer.DLComposer;
import java.util.HashMap;
import java.util.Map;
import org.zkoss.zk.ui.Component;
import org.zkoss.zkplus.databind.Binding;
import org.zkoss.zkplus.databind.DataBinder;
import org.zkoss.zul.impl.XulElement;

@Controller //this class serves as a controller
public class TestController extends DLComposer {

    @ZkModel //this property is published and accessible from ZUL file
    String bindingValue = "there is binding text";

    @ZkEvent( id = "btn" ) //this methods is invoked on "onClick" event on component "btn"
    public void onOk() throws Exception {
        DLTextbox textbox = new DLTextbox();
        textbox.setParent( self );
        setValueAnnotation( textbox, "value", "ctl.bindingValue" );    
    }

    /**
     * Sets the component's annotation to specific value
     * (call eg. setValueAnnotation(comp, "model", "aaa") is corresponding to model="@{aaa}")
     * @param comp defined component
     * @param propName name of property
     * @param annot annotation
     */
    private void setValueAnnotation( XulElement comp, String propName, String annot ) {
        DataBinder binder = ( DataBinder ) comp.getVariable( "binder", false );

        //adds new binding
        Map attrs = new HashMap();
        attrs.put( "value", annot );
        binder.addBinding( comp, propName, annot );

        //if the first bean is fellow then register it ( if it hasn't been used yet then it is not registered. )
        String bean = annot;
        if ( bean.contains( "." ) ) {
            bean = bean.split( "\\." )[0];
        }
        Component fellowBean = comp.getFellowIfAny( bean );
        if ( fellowBean != null ) {
            binder.bindBean( bean, fellowBean );
        }

        //load components value
        Binding bind = (( DataBinder ) comp.getVariable( "binder", false )).getBinding( comp, propName );
        if ( bind != null ) {
            bind.loadAttribute( comp );
        }

    }
}

Wenn ich diese beiden Dateien die Anwendung funktioniert gut. Auf onClick-Ereignis auf den button neues Textfeld erstellt und der Wert ist binden, um die richtige Immobilie. Aber jetzt, wenn ich die Kommentar-textbox-Komponente in ZUL-Datei

        <!--textbox id="txt1" value="@{ctl.bindingValue}"/-->

dann Stoppt es zu arbeiten. Jetzt gibt es geworfen Ausnahme

Nicht finden kann die angegebene databind
bean Ausdruck:ctl.bindingValue

org.zkoss.zkplus.databind.DataBinder(DataBinder.java#myGetBeanWithExpression:1004)
org.zkoss.zkplus.databind.DataBinder(DataBinder.java#getBeanAndRegisterBeanSameNodes:988)
org.zkoss.zkplus.databind.Binding(Binding.java#loadAttribute:413)
cz.datalite.bpej.evidence.TestController(TestController.java#setValueAnnotation:58)
cz.datalite.bpej.evidence.TestController(TestController.java#onOk:25)

- Und das ist das problem. Ich muss in der Lage sein erstellen Sie eine neue Komponente und fügen Sie Ihre databinding, ohne über die bean-in ZUL-Datei. Ich muss in der Lage sein, um es zu registrieren, den controller. Können Sie mir helfen, bitte? Ich werde wirklich dankbar.

InformationsquelleAutor Gaim | 2010-07-28

Schreibe einen Kommentar