在viewmodel更改后调用方法

时间:2015-07-31 09:51:18

标签: java mvvm zk

我想在viewmodel中的每次更改后调用一个方法(总是相同的方法)。我怎么能以聪明的方式做到这一点?

说明: UI中的每个可更改值表示容器的选项。如果选项被更改,我想重新呈现容器。

viewmodel由几个带有拖放功能的列表框组成。删除和一些复选框。我不想在每次 onClick / Select 之后调用该方法,或者拖动&放弃改变。

应更新的容器是zk窗口中的div块 像这样的东西:

<zk>
<window>
<vlayout>
<div id="display"></div>
</vlayout>
</window>
<zk>

我想从图表中编辑轴因此我使用java生成一个创建图表的json字符串:

@Command    
public void script()
    {
            String json = gson.toJson(somechart);

            Clients.evalJavaScript("chart("+ json +")");
    }

从早期的zul页面启动javascript函数

<script type="text/javascript">
        function testChart(json){
            var display = jq("$display");

            $(function () { 
                $(display).highcharts(json);
            });
        };
        </script>

如果选择更改的轴我想调用脚本方法。

有一个清单:

List<Axis> selectedAxis
//getters & setters

包含所有当前选定的轴,它们可以拖放,另一个列包含所有未选定的轴。还有其他一些东西可以改变,如标题,图表类型等,并且我想在更改后调用脚本方法。

因此 @NotifyChange 无法工作因为它只与框架一起运行以重新渲染显示的内容以匹配变量的当前状态。

@DepensOn 会在其他变量发生变化并重新渲染时更改变量。

两者都不能用于我的目的,因为我想在每次使用新值重新创建图表的更改后调用方法 script()并执行渲染本身通过JS。

对于Drag&amp; Drop,我使用Java中的方法(插入onInsert [更改列表顺序]和DropOn [将项目从一个列表拖放到另一个列表])

@Command
@NotifyChange({"selectedAxis","notSelectedAxis"})
public void onInserTo(@BindingParam("base") Axis base,@BindingParam("item") Axis item)
{
   ...
}

我唯一的结论是我必须在Viewmodel的每个onChange()方法中调用script()。

2 个答案:

答案 0 :(得分:0)

我认为考虑到你使用viewmodel方式最优雅的方法是使用@NotifyChange注释。 UI中的每个可更改值都必须与viewmodel中的属性相关联,并且绑定正确关联

有一个样本:

tableHeaderView

我希望有所帮助。

答案 1 :(得分:0)

您可以使用@DependsOn注释,如下例所示。将注释放在容器上方,并放在要依赖的每个bean中:

DependsOn Example