【问题标题】:Java Tapestry Autocomplete typeahead include ID on listingJava Tapestry Autocomplete typeahead 包括列表中的 ID
【发布时间】:2017-09-21 09:23:37
【问题描述】:

我有一个在挂毯上使用自动完成混合的文本字段。 mixin 工作正常,但我在用重复值标记名称列表的值时遇到问题。现在我想知道是否可以在选择时以某种方式在自动完成时传递数据的 id。

这是我用于填充列表的代码。

List<String> onProvideCompletionsFromUserName(String partial) {
        List<String> matches = new ArrayList<String>();
        String partialUpper = partial.toUpperCase();

    List<User> users = clientFinder.findUsers();
    // int i = 0;

    for (User user : users){
        String name = NameUtil.toName(user.getFirstName(), user.getFamilyName());

        if (name.toUpperCase().contains(partialUpper)) {
            matches.add(name );
            // if (i++ >= 5) {
            // break;
            // }
        }
    }

    return matches;
}

有没有办法让我用列表传递 ID

(列出 onProvideCompletionsFromUserName)?

有没有人也遇到过这个问题?感谢您的答复。

【问题讨论】:

    标签: java autocomplete tapestry typeahead


    【解决方案1】:

    我能够做到这一点的唯一方法是使用我自己的版本扩展 Autocomplete mixin,因为 mixin 中的 configure 方法被标记为受保护。这是我的课。请注意,我正在触发我自己的事件。您必须在providecompletions 处理程序中为label、value 和uid 提供您自己的值。 zone 参数是当用户单击完成列表中的项目时要更新的区域。

    混音:

    import java.util.ArrayList;
    import java.util.List;
    import org.apache.tapestry5.BindingConstants;
    import org.apache.tapestry5.ComponentResources;
    import org.apache.tapestry5.annotations.OnEvent;
    import org.apache.tapestry5.annotations.Parameter;
    import org.apache.tapestry5.ioc.annotations.Inject;
    import org.apache.tapestry5.json.JSONLiteral;
    import org.apache.tapestry5.json.JSONObject;
    import org.got5.tapestry5.jquery.mixins.Autocomplete;
    
    public class UserAutocomplete extends Autocomplete {
        public static final String CHANGE_EVENT_NAME = "autocompleteUser";
    
        @Inject
        private ComponentResources resources;
    
        @Parameter(defaultPrefix=BindingConstants.LITERAL)
        private String zone;
    
        @OnEvent(value = "provideCompletions")
        public List<JSONObject> autoComplete(String query) {
            List<JSONObject> strings = new ArrayList<JSONObject>();
    
            if(query != null) {
                for(User u : service.searchUsers(query.trim())) {
                    JSONObject so = new JSONObject();
                    String name = u.getName();
                    so.put("label", name);
                    so.put("value", name);
                    so.put("uid", u.getId());
                    strings.add(so);
                }
            }
    
            return strings;
        }
    
    
        protected void configure(JSONObject config) {
            config.put("url", resources.createEventLink("autocomplete").toURI());
            String url = resources.createEventLink(CHANGE_EVENT_NAME).toURI();
            config.put("options", new JSONObject().put("select", new JSONLiteral("function(e, d) {var zone = $('#" + zone + "'); if (!zone) { return; } "
                    + "zone.tapestryZone('update', {url: '" + url + "'+'/'+d.item.uid});}")));
        }
    }
    

    页面模板:

    <t:textfield value="query" autocomplete="off" t:mixins="UserAutocomplete" t:zone="resultZone" />
    

    页面类:

    ...
    
    @InjectComponent
    private Zone resultZone;
    
    @OnEvent(value = UserAutocomplete.CHANGE_EVENT_NAME)
    void userChange(Integer id) {
        User selectedUser = service.findUser(id);
        renderer.addRender(resultZone);
    }
    

    【讨论】:

    • 感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多