2017-09-21 8 views
0

私はタペストリーにオートコンプリートmixinを使用するテキストフィールドを持っています。 mixinは正常に動作していますが、重複した値を持つ名前リストの値にタグを付けることに問題があります。今私は何とか選択時にオートコンプリートに関するデータのIDを渡すことができるかどうか疑問に思っています。Java Tapestryオートコンプリート先頭にIDを記載しています

ここでは、リストをpupulatingのための私のコードです。

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

mixinのconfigureメソッドが保護されているとマークされているため、私はそれを行うことができた唯一の方法は​​3210自分のバージョンでmixinを拡張することでした。ここに私のクラスです。私は自分のイベントを発砲していることに注意してください。 providecompletionsハンドラでは、labelvalueおよびuidの値を指定する必要があります。ゾーンパラメータは、ユーザーが完了リスト内の項目をクリックしたときに更新するゾーンです。

MIXIN:

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

関連する問題