2010-02-27 43 views
11

Có cách nào để tự động điền cho hộp tổ hợp bắt đầu từ bất kỳ vị trí nào trong văn bản, hãy để tôi cung cấp cho bạn một ví dụ. Nếu tôi có ai đó tên là john smith trong combobox nếu tôi bắt đầu với chữ 'j' nó kéo john smith nhưng ít nói rằng tôi muốn bắt đầu với chữ 's' để tìm kiếm họ của mình, là có thể, nếu có không ai có mã hoặc một liên kết đến mã thực hiện điều này.hộp tổ hợp tự động hoàn thành

+0

Kiểm tra http://dev.arcbees.com/gwtchosen/ dựa trên GQuery –

Trả lời

12

Bạn đã xem SuggestBox chưa? MultiWordSuggestOracle cung cấp dữ liệu cho hộp đề xuất dường như thực hiện chính xác những gì bạn muốn - xem javadocs về cách sử dụng và ví dụ.

Cập nhật: Dưới đây là một ví dụ khá tốt đẹp của tùy GWT của SuggestBox để trông giống như một trong những trên Facebook: http://raibledesigns.com/rd/entry/creating_a_facebook_style_autocomplete Hãy chắc chắn để làm theo tất cả các liên kết trong bài hướng dẫn đó, vì chúng chứa rất nhiều thông tin về việc sử dụng SuggestBox.

2

Override phương pháp boolean (kỷ lục ModelData, String tài sản) isFiltered của ListStore của phương pháp cơ thể combobox.The sẽ được như sau:

if (filterBeginsWith != null && property != null) { 
    Object o = record.get(property); 
    if (o != null) { 
     if (!o.toString().toLowerCase().contains(filterBeginsWith.toLowerCase())) { 
      return true; 
     } 
    } 
} 
if (filters != null) { 
    for (StoreFilter filter : filters) { 
     boolean result = filter.select(this, record, record, property); 
     if (!result) { 
      return true; 
     } 
    } 
} 
return false; 
3

tôi được có bất kỳ vấn đề với AdvancedComboBoxExample sencha http://www.sencha.com/examples/#ExamplePlace:advancedcombobox

Tôi tìm thấy trong liên kết này http://www.sencha.com/forum/showthread.php?222543-CRTL-C-triggers-a-reload-of-data-in-Combobox phản hồi cho sự cố của tôi.

Tôi phải thực hiện một số điều chỉnh đối với mã của mình. Dưới đây là mã cho những ai cần nó.

ComboBox ajax mà không phân trang:

import com.extjs.gxt.ui.client.data.*; 
import com.extjs.gxt.ui.client.store.ListStore; 
import com.extjs.gxt.ui.client.widget.form.ComboBox; 
import com.google.gwt.user.client.rpc.AsyncCallback; 
import java.util.List; 
import java.util.Map; 

public class AjaxComboBox<T extends ModelData> extends ComboBox<T> { 

    public AjaxComboBox() { 
    } 

    public interface GetDataCallback<T> { 

     void getData(String query, AsyncCallback<List<T>> dataCallback); 
    } 

    public AjaxComboBox(final String displayField, final int minChars, final GetDataCallback<T> getDataCallback) { 
     final RpcProxy<ListLoadResult<T>> proxy = new RpcProxy<ListLoadResult<T>>() { 

      @Override 
      protected void load(final Object loadConfig, final AsyncCallback<ListLoadResult<T>> callback) { 
       ListLoadConfig load = (ListLoadConfig) loadConfig; 
       final Map<String, Object> properties = load.getProperties(); 

       getDataCallback.getData((String) properties.get("query"), new AsyncCallback<List<T>>() { 

        public void onFailure(Throwable caught) { 
         caught.printStackTrace(); 
        } 

        public void onSuccess(List<T> result) { 
         callback.onSuccess(new BaseListLoadResult<T>(result)); 
        } 
       }); 

      } 
     }; 
     final BaseListLoader<ListLoadResult<T>> loader = new BaseListLoader<ListLoadResult<T>>(proxy); 
     final ListStore<T> store = new ListStore<T>(loader); 
     setFieldLabel(displayField); 
     setStore(store); 
     setHideTrigger(true); 
     setMinChars(minChars); 
     setWidth(300); 
    } 

} 

ComboBox lười biếng với phân trang

import com.extjs.gxt.ui.client.data.*; 
import com.extjs.gxt.ui.client.event.Listener; 
import com.extjs.gxt.ui.client.store.ListStore; 
import com.extjs.gxt.ui.client.widget.form.ComboBox; 
import com.google.gwt.user.client.rpc.AsyncCallback; 
import java.util.Map; 

public class ComboBoxLazy<T extends ModelData> extends ComboBox<T> { 

    public interface GetPagingDataCallback<T> { 

     void getData(String query, PagingLoadConfig loadConfig, 
       AsyncCallback<PagingLoadResult<T>> dataCallback); 
    } 

    public ComboBoxLazy(final String displayField, final int minChars, 
      final GetPagingDataCallback<T> getDataCallback) { 


     final RpcProxy<PagingLoadResult<T>> proxy = new RpcProxy<PagingLoadResult<T>>() { 

      @Override 
      protected void load(Object loadConfig, 
        final AsyncCallback<PagingLoadResult<T>> callback) { 
       final Map<String, Object> properties = ((PagingLoadConfig) loadConfig).getProperties(); 
       getDataCallback.getData((String) properties.get("query"), 
         ((PagingLoadConfig) loadConfig), 
         new AsyncCallback<PagingLoadResult<T>>() { 

          @Override 
          public void onSuccess(
            final PagingLoadResult<T> result) { 
           callback.onSuccess(result); 
          } 

          @Override 
          public void onFailure(Throwable caught) { 
           callback.onFailure(caught); 
          } 
         }); 
      } 
     }; 


     ModelReader reader = new ModelReader(); 
     final BasePagingLoader<PagingLoadResult<T>> loader = new BasePagingLoader<PagingLoadResult<T>>(
       proxy, reader); 
     loader.addListener(Loader.BeforeLoad, new Listener<LoadEvent>() { 

      public void handleEvent(LoadEvent be) { 
       be.<ModelData>getConfig().set("start", 
         be.<ModelData>getConfig().get("offset")); 
      } 
     }); 

     setFieldLabel(displayField); 
     final ListStore<T> store = new ListStore<T>(loader); 
     setStore(store); 
     setHideTrigger(true); 
     setMinChars(minChars); 
     setPageSize(10); 
     setWidth(300); 
    } 

} 

Lớp Kiểm tra

import br.ueg.escala.client.view.ConversorBeanModel; 
import com.extjs.gxt.ui.client.data.*; 
import com.extjs.gxt.ui.client.event.SelectionChangedEvent; 
import com.extjs.gxt.ui.client.event.SelectionChangedListener; 

import com.extjs.gxt.ui.client.widget.LayoutContainer; 
import com.extjs.gxt.ui.client.widget.VerticalPanel; 
import com.google.gwt.user.client.Element; 
import com.google.gwt.user.client.rpc.AsyncCallback; 
import java.util.List; 
public class ComboBoxTest extends LayoutContainer { 

    @Override 
    protected void onRender(Element parent, int index) { 
     super.onRender(parent, index); 
     criarComboBox(); 
     criarComboBoxLazy(); 
    } 

    private void criarComboBox() { 

     final AjaxComboBox<BeanModel> combo = new AjaxComboBox<BeanModel>("name", 3, new AjaxComboBox.GetDataCallback<BeanModel>() { 

      public void getData(String query, final AsyncCallback<List<BeanModel>> dataCallback) { 
       servico.loadLike(query, new AsyncCallback<List<Person>>() { 

        public void onFailure(Throwable caught) { 
         caught.printStackTrace(); 
        } 

        public void onSuccess(List<Person> result) { 
         List<BeanModel> dados = ConversorBeanModel.getListBeanModel(result); 
         dataCallback.onSuccess(dados); 
        } 
       }); 
      } 
     }); 

     combo.addSelectionChangedListener(new SelectionChangedListener<BeanModel>() { 

      @Override 
      public void selectionChanged(SelectionChangedEvent<BeanModel> se) { 
       BeanModel bm = combo.getView().getSelectionModel().getSelectedItem(); 
       Person p = bm.getBean(); 
       combo.setValue(bm); 

       try { 
        combo.setValue(bm); 
        combo.setRawValue(p.getName()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } 
     }); 

     combo.setItemSelector("div.search-item"); 
     combo.setTemplate(getTemplate()); 

     addText("Any text"); 
     add(combo); 
    } 

    private void criarComboBoxLazy() { 
     String field = "name"; 
     final ComboBoxLazy<BeanModel> comboLazy = new ComboBoxLazy<BeanModel>(field, 3, new      ComboBoxLazy.GetPagingDataCallback<BeanModel>() { 

      public void getData(String query, PagingLoadConfig loadConfig, final AsyncCallback<PagingLoadResult<BeanModel>> dataCallback) { 
       final PagingLoadConfig load = (PagingLoadConfig) loadConfig; 

       servico.loadLike(load, new Person(), "name", query, new AsyncCallback<List>() { 

        public void onFailure(Throwable caught) { 
         caught.printStackTrace(); 
        } 

        public void onSuccess(List result) { 
         PagingLoadResult<BeanModel> dados = ConversorBeanModel.getPagingLoadResultBeanModel(result, load); 
         dataCallback.onSuccess(dados); 
        } 
       }); 
      } 
     }); 

     comboLazy.addSelectionChangedListener(new SelectionChangedListener<BeanModel>() { 

      @Override 
      public void selectionChanged(SelectionChangedEvent<BeanModel> se) { 
       BeanModel bm = comboLazy.getView().getSelectionModel().getSelectedItem(); 
       Person p = bm.getBean(); 
       comboLazy.setValue(bm); 

       try { 
        comboLazy.setValue(bm); 
        comboLazy.setRawValue(p.getName()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } 
     }); 

     comboLazy.setItemSelector("div.search-item"); 
     comboLazy.setTemplate(getTemplate()); 

     VerticalPanel vp2 = new VerticalPanel(); 
     vp2.setSpacing(10); 
     vp2.addText("<span class='text'><b>Combo lazy</span>"); 
     vp2.add(comboLazy); 
     add(vp2); 
    } 

    private native String getTemplate() /*-{ 
    return [ '<tpl for="."><div class="search-item">', 
    ' <h3> <span> Name:</span> <span style="font-weight:normal;">{name}</span> ', 
    ' <span> - Last name:</span> <span style="font-weight: normal">{lastName}</span></h3>', '</div></tpl>'].join(""); 
    }-*/; 

} 

Application.css:

.searchItem { 
    font: normal 11px tahoma, arial, helvetica, sans-serif; 
    padding: 3px 10px 3px 10px; 
    white-space: normal; 
    color: #555; 
} 

.searchItem h3 { 
    display: block; 
    font: inherit; 
    font-weight: bold; 
    color: #222; 
} 

.searchItem h3 span { 
    float: right; 
    font-weight: normal; 
    margin: 0 0 5px 5px; 
    width: 100px; 
    display: block; 
    clear: none; 
} 

Máy chủ mã

public List loadLike(PagingLoadConfig config, Person classe, String field, String query) { 
    List<Person> list = null; 
    try { 
     List listEntity = genericoBC.loadLike(config.getOffset(), config.getLimit(), field, query, classe.getClass()); 
     list = clone(listEntity); 

     final int totalCount = genericoBC.contarRegistros(classe.getClass()); 
     config.setLimit(totalCount); 
    } catch (Exception e) { 
     tratarExcecao("", e); 
    } 
    return list; 
} 

public List<Person> loadLike(String query) { 
    List<Person> list = null; 
    try { 
     List<Person> listEntity = genericoBC.loadLike(query); 
     list = clone(listEntity); 
    } catch (Exception e) { 
     tratarExcecao("Error:genericoBC.loadLike(query)", e); 
    } 
    return list; 
} 
0

Đây là dành cho GXT 3.0.

Đầu tiên, tạo một thể hiện của lớp ListStore ghi đè như thế này:

public static class MyListStore extends ListStore<Course>{ 
    private String userText=""; 
    public MyListStore(ModelKeyProvider<Course> k){ 
    super(k); 
    } 

    @Override 
    protected boolean isFilteredOut(Course item) { 
    boolean result = false; 
    if(item.getTitle()!=null && 
     !item.getTitle().toUpperCase().contains(userText.toUpperCase())){ 
     result = true; 
    } 
    return result; 
    } 
    public void setUserText(String t){ userText = t; } 
} 

Trong trường hợp này, tôi đã có một lớp mô hình học mà đã có danh hiệu gôn (một chuỗi) là nhà cung cấp nhãn cho combobox . Vì vậy, trong lớp học đã ghi đè của bạn, hãy làm tương tự: sử dụng mô hình cụ thể của bạn (loại trường hợp này của combobox) thay cho 'Khóa học' trong đoạn mã trên.

Tiếp theo, tạo một thể hiện của cửa hàng này để sử dụng bởi các combobox:

private MyListStore courses ; 

Tiếp theo, hãy chắc chắn rằng bạn khởi tạo combobox một cách thích hợp với điều này.Trong trường hợp của tôi, tôi đã sử dụng UiBinder, vì vậy initializer của tôi là thế này:

@UiFactory 
    ListStore<Course> createListStore() { 
    courses = new MyListStore(courseProps.key()); 
    return courses; 
    } 

Các đoạn UiBinder liên quan:

<ui:with type="com.sencha.gxt.data.shared.LabelProvider" field="titles"/> 
    <ui:with type="com.sencha.gxt.data.shared.ListStore" field="courses"/> 
    ... 
    <form:ComboBox ui:field="classTitle" store="{courses}" labelProvider="{titles}" 
     allowBlank="false" forceSelection="true" triggerAction="ALL" width="200" /> 

Tất nhiên, các mối liên kết vào lớp java ràng buộc của bạn:

@UiField ComboBox<Course> classTitle; 

Và, cuối cùng, hãy đảm bảo bạn xử lý sự kiện keyup từ đầu vào combobox:

classTitle.addKeyUpHandler(new KeyUpHandler(){ 
    @Override 
    public void onKeyUp(KeyUpEvent event) { 
    courses.setUserText(classTitle.getText()); 
    } 
}); 

Điều này làm việc hoàn hảo (lần đầu tiên!).

Các vấn đề liên quan