Revision history [back]

click to hide/show revision 1
initial version

answered 2018-06-20 12:21:26 +0800

matthung gravatar image matthung

Hi all, thanks for your comments, finally change as below

main.zul

<zk>
<window viewModel="@id('vm') @init('org.my.MainVM')>
    <include id="include" src="@load(vm.currentUrl)" data="@load(vm.data)"/>
</window>
</zk>

MainVM.java

public class MainVM {

    private String currentUrl;
    private Object data;

    @GlobalCommand
    @NotifyChange({"currentUrl", "data"})
    public void changeIncludeUrl (@BindingParam('url') String url ,
                                    @BindingParam('person') Person person) throws Exception {
        currentUrl = url;
        data = employee;
    }

    // getter and setter    

}

person.zul (inner1)

<zk>
    <div viewModel="@id('vm') @init('org.my.vm.PersonVM')"> 

        <grid model="@load(vm.personList)">
            ...
            <template name="model">
                ...
                <button label="Edit" 
                        onClick="@global-command('changeIncludeUrl', url='/edit.zul', person=each)"/>
                ...
            </template>
        </grid> 
    </div>
</zk>

PersonVM.java (Inner1VM)

public class PersonVM {

    private List<Person> personList;
    ...
    // getter and setter    

}

PersonEditVM.java (Inner2VM)

public class PersonEditVM {

    private editPerson;

    @Init
    public void init(@ExecutionArgParam("data") Object data) {
        editPerson = (Person) data;

    }
    // getter and setter    
}

Hi all, thanks for your comments, finally change as below

main.zul

<zk>
<window viewModel="@id('vm') @init('org.my.MainVM')>
    <include id="include" src="@load(vm.currentUrl)" data="@load(vm.data)"/>
</window>
</zk>

MainVM.java

public class MainVM {

    private String currentUrl;
    private Object data;

    @GlobalCommand
    @NotifyChange({"currentUrl", "data"})
    public void changeIncludeUrl (@BindingParam('url') String url ,
                                    @BindingParam('person') Person person) throws Exception {
        currentUrl = url;
        data = employee;
person;
    }

    // getter and setter    

}

person.zul (inner1)

<zk>
    <div viewModel="@id('vm') @init('org.my.vm.PersonVM')"> 

        <grid model="@load(vm.personList)">
            ...
            <template name="model">
                ...
                <button label="Edit" 
                        onClick="@global-command('changeIncludeUrl', url='/edit.zul', person=each)"/>
                ...
            </template>
        </grid> 
    </div>
</zk>

PersonVM.java (Inner1VM)

public class PersonVM {

    private List<Person> personList;
    ...
    // getter and setter    

}

PersonEditVM.java (Inner2VM)

public class PersonEditVM {

    private editPerson;

    @Init
    public void init(@ExecutionArgParam("data") Object data) {
        editPerson = (Person) data;

    }
    // getter and setter    
}

Hi all, thanks for your comments, finally change as below

main.zul

<zk>
<window viewModel="@id('vm') @init('org.my.MainVM')>
    <include id="include" src="@load(vm.currentUrl)" data="@load(vm.data)"/>
</window>
</zk>

MainVM.java

public class MainVM {

    private String currentUrl;
    private Object data;

    @GlobalCommand
    @NotifyChange({"currentUrl", "data"})
    public void changeIncludeUrl (@BindingParam('url') String url ,
                                    @BindingParam('person') Person person) throws Exception {
        currentUrl = url;
        data = person;
    }

    // getter and setter    

}

person.zul (inner1)

<zk>
    <div viewModel="@id('vm') @init('org.my.vm.PersonVM')"> 

        <grid model="@load(vm.personList)">
            ...
            <template name="model">
                ...
                <button label="Edit" 
                        onClick="@global-command('changeIncludeUrl', url='/edit.zul', person=each)"/>
                ...
            </template>
        </grid> 
    </div>
</zk>

PersonVM.java (Inner1VM)

public class PersonVM {

    private List<Person> personList;
    ...
    // getter and setter    

}

PersonEditVM.java (Inner2VM)(Inner2VM , edit.zul's viewModel)

public class PersonEditVM {

    private editPerson;

    @Init
    public void init(@ExecutionArgParam("data") Object data) {
        editPerson = (Person) data;

    }
    // getter and setter    
}
click to hide/show revision 4
fix according to cor3000's comments

Hi all, thanks for your comments, finally change as below

main.zul

<zk>
<window viewModel="@id('vm') @init('org.my.MainVM')>
    <include id="include" src="@load(vm.currentUrl)" data="@load(vm.data)"/>
</window>
</zk>

MainVM.java

public class MainVM {

    private String currentUrl;
    private Object data;

    @GlobalCommand
    // @NotifyChange({"currentUrl", "data"})
"data"}) // potential execution notify order issue, please see cor3000's comments below
    public void changeIncludeUrl (@BindingParam('url') String url ,
                                    @BindingParam('person') Person person) throws Exception {
        currentUrl = url;
        data = person;
employee;
        BindUtils.postNotifyChange(null, null, this, "data"); // make sure the NotifyChange order
        BindUtils.postNotifyChange(null, null, this, "currentUrl");
    }

    // getter and setter     
}

person.zul (inner1)

<zk>
    <div viewModel="@id('vm') @init('org.my.vm.PersonVM')"> 

        <grid model="@load(vm.personList)">
            ...
            <template name="model">
                ...
                <button label="Edit" 
                        onClick="@global-command('changeIncludeUrl', url='/edit.zul', person=each)"/>
                ...
            </template>
        </grid> 
    </div>
</zk>

PersonVM.java (Inner1VM)

public class PersonVM {

    private List<Person> personList;
    ...
    // getter and setter    

}

PersonEditVM.java (Inner2VM , edit.zul's viewModel)

public class PersonEditVM {

    private editPerson;

    @Init
    public void init(@ExecutionArgParam("data") Object data) {
        editPerson = (Person) data;

    }
    // getter and setter    
}
Support Options
  • Email Support
  • Training
  • Consulting
  • Outsourcing
Learn More