繁体   English   中英

从 Wicket 的外部 class 中的内部 onClick 方法访问变量

[英]Access variable from inner onClick method in outer class in Wicket

我有一个看起来像这样的 class

    private static class LinkTest extends WebMarkupContainer {
        public LinkTest(String id) {
            super(id);
            AjaxLink<Object> link = new AjaxLink<>("link") {
                @Override
                public void onClick(AjaxRequestTarget target) {
                    String content = //... some function call
                }
            };
            add(link);
            // .. how to access "content" variable here
            link.add(new Label("label", Model.of(content)));
            add(new AttributeAppender("onclick",
              new Model(format("alert('%s');", contentModel)), ";"));
        }
    }

我想访问 LinkTest 构造函数中的“内容”变量。 任何想法如何做到这一点?

private static class LinkTest extends WebMarkupContainer {
  public LinkTest(String id) {
    super(id);

    // 1
    IModel<String> contentModel = Model.of("initial value");
    AjaxLink<String> link = new AjaxLink<>("link", contentModel) {
        @Override
        public void onClick(AjaxRequestTarget target) {
            // 2
            contentModel.setObject("a new value");

            // 3
            target.add(this.get("label"));

            // 5
            target.appendJavaScript("alert('"+contentModel.getObject()+"');");
        }
    };
    add(link);
    Label label = new Label("label", contentModel);
    link.add(label);
    //4
    label.setOutputMarkupId(true);
}

}

  1. 这个想法是为content使用一个可共享的容器。 在 Wicket 中,这是 model ( IModel )。
  2. 单击链接后,您将更新 model
  3. 要更新 Label,您需要将其添加到 AjaxRequestTarget。
  4. 不要忘记通过调用.setOutputMarkupId(true)来更新 Label Ajax
  5. 通过使用target.appendJavaScript(CharSequence)您可以将新计算的content发送到浏览器

通过在两个组件之间共享 model 即可轻松解决。

private static class LinkTest extends WebMarkupContainer {
    public LinkTest(String id) {
        super(id);
        IModel<String> contentModel = ()-> /* some function call */;
        AjaxLink<String> link = new AjaxLink<>("link", contentModel) {
            @Override
            public void onClick(AjaxRequestTarget target) {
                target.add(this);
                target.appendJavaScript("alert('"+getModelObject()+"');");
            }
        };
        add(link);
        // .. how to access "content" variable here
        link.add(new Label("label", contentModel));
    }
}

一个匿名的 class 可以访问其封闭的 class 的成员。 所以你可能会做这样的事情

private static class LinkTest extends WebMarkupContainer {
     //Here!
     String content;
     
     public LinkTest(String id) {
        super(id);
        AjaxLink<Object> link = new AjaxLink<>("link") {
            @Override
            public void onClick(AjaxRequestTarget target) {
                content = //... some function call
            }
        };
        add(link);
        // .. how to access "content" variable here
        link.add(new Label("label", Model.of(content)));
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM