【zk開発】ページでcomposerオブジェクトを取得する方法
サンプル:
<window id="userWin" apply="org.sunflower.web.controller.zk.UserController">
:<button label=" ..." upload="true,maxsize=-1,native"
onUpload="userWin$composer.handleUploadLogo(event.media)"/>
</window>
UserControllerコード、GenericComponentまたはそのサブクラスを継承
import org.zkoss.util.media.Media;
import org.zkoss.zk.ui.util.GenericComposer;
public class UserController extends GenericComposer {
private static final long serialVersionUID = -3801962286418473844L;
public void handleUploadLogo(Media media) {
System.out.println(media.getName());
}
}
質問:
userWin$composer変数はどこから来ますか?
GenericComponent部分ソースコード
abstract public class GenericComposer extends GenericEventListener
implements Composer, ComposerExt, java.io.Serializable {
.....................................
// comp apply=“xxx.xxx.XXXcomposer”
//since 3.6.1
public void doBeforeComposeChildren(Component comp) throws Exception {
//assign this composer as a variable
//feature #2778508
Components.wireController(comp, this); // wireController
}
................................
}
便宜上、以下に○○類のソースコードを一つ一つ説明せず、関連ソースコードのみを貼り付ける
1,
public static final
void wireController(Component comp, Object controller, char separator) {
new Wire(controller, separator).wireController(comp, comp.getId());//
}
2、それから次のコードを見て、すべてが明らかになりました.
/**
* Inject controller as variable of the specified component.
*/
private void wireController(Component comp, String id) {
//feature #2778513, support {id}$composer name
final String composerid = id + _separator + "composer";
if (!comp.hasAttributeOrFellow(composerid, false)) {
comp.setAttribute(composerid, _controller);
}
comp.setAttribute(varname(id, _controller.getClass()), _controller);
}
解釈コード
まずcomposerid文字列をつなぎ、composeridはcomp.getId、_seperator、「composer」構成
そのうち_seperatorの値はデフォルト$です.もちろんComponentsのようなものを使用できます.wireController(comp, controller, separator);
3番目のパラメータを指定する方法でデフォルト$を変更します.