2017-09-21 19 views
0

나는 자동 완성 믹스 인을 태피스 트리에 사용하는 텍스트 필드가 있습니다. 믹스 인은 정상적으로 작동하지만 중복 값으로 이름 목록의 값에 태그를 지정하는 데 문제가 있습니다. 이제 어떻게하면 자동 완성에 대한 데이터의 ID를 선택시 전달할 수 있는지 궁금합니다.Java Tapestry 자동 완성 선행 입력 내용의 아이디가 포함되었습니다.

다음은 목록을 작성하는 코드입니다.

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; 
} 

(목록 onProvideCompletionsFromUserName) 같은 목록으로 ID를 전달하는 방법이 있나요?

누구에게도이 문제가 발생 했습니까? 귀하의 회신에 감사드립니다.

답변

0

믹스 라인의 configure 메서드가 protected로 표시되어 있기 때문에 내가 할 수 있었던 유일한 방법은 Autocomplete 믹스 인을 내 자신의 버전으로 확장하는 것이 었습니다. 여기 수업이 있습니다. 나는 내 자신의 사건을 해고하고있다. providecompletions 처리기에 label, valueuid에 대한 값을 지정해야합니다. 영역 매개 변수는 사용자가 완료 목록에서 항목을 클릭 할 때 업데이트 할 영역입니다.

믹스 인 :

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); 
} 
+0

감사합니다. – banri16