在OperaMasks 2.3及之前版本中,构件属性的局部更新机制并不完善。一个构件某些属性的更新可以立刻生效,而另一些属性更新则必须要使用AjaxUpdater或repaint方法重画构件才能生效,开发者必须自行关注各个属性的更新特性。 另一方面,开发者对构件值更新没有有效的控制手段,OperaMasks引擎自动对页面上所有的输入输出域进行值更新。除了占用额外带宽,还可能出现表单外部的一些输入域被意外清空的情况,开发者必须自行维护页面上所有输入输出域的跨请求状态。
OperaMasks 3.0对局部更新体系进行了统一梳理,引入了新的局部更新机制。OperaMasks 3.0中的局部更新机制允许开发者对更新范围与内容进行更有效的控制,节省带宽,提高性能,并有效保证在AJAX环境下的页面逻辑正确性。
在OperaMasks 3.0中:
与发起本次请求的构件位于同一表单内的输入输出域将自动进行值更新;
表单外部的构件值在默认情况下不进行自动更新,开发者可以根据实际需要通过编程方式将表单外部构件注册局局更新;
可使用<ajax:linkedUpdate>构件在页面上注册需要关联更新的构件;
<w:form>
请输入您的名字:
<w:textField id="name"/>
<w:button id="action" label="提交">
<ajax:linkedUpdate target="result">
</w:button>
</w:form>
<h:outputText id="result"/>
可使用PartialUpdateManager对象在LiteBean中注册需要关联更新的构件;
@Inject
private PartialUpdateManager update;
@Action
private void action() {
update.markUpdate("result");
}
开发者可以明确注册需要进行局部更新的构件属性,引擎自动选择合适的方式进行更新。
@Inject
private PartialUpdateManager update;
@Bind
private String name, result;
@Bind(id="panel", attribute="title")
private String title;
@Action
private void action() {
result = "Hi! " + name;
title = "当前用户:" + name;
update.markAttributeUpdate("result", "value");
update.markAttributeUpdate("panel", "title");
}
关于局部更新更详细的信息请参考第 21 章 页面局部更新。