2016-12-12 2 views
0

1つのデータテーブルのみからなるページを生成したい。このデータテーブルでは、ユーザーがクリックしたときに何かをするリンクが1つの列に含まれている必要があります。 これは、LinkPropertyColumnのさまざまな実装を使用して単純なタスクと思われます。私は、少し異なる実装をたくさんテストした後、hereの実装を使用することに決めました。すべての実装で同じ結果が得られました。テーブルは完全に正しいテキストで生成されましたが、列内に生成されたリンクはクリックできませんでした。それらをクリックすると何も起こりません。マウスの上には、通常のリンクとして青色で表示されていますが、下線は付けられていません。私が発見したテキストを追加すると、AjaxLinkのonClickメソッドは呼び出されません。誰かが私にヒントを与えることができたら本当に感謝します。Wicket 6:LinkPropertyColumnを使用してDataTableでリンクをクリックできない

ここに私のページクラスです:

@AuthorizeInstantiation("CHART_CONFIG_READ") 
public class PrChartListPage extends PrBasePage { 

private static final long serialVersionUID = 1L; 
public static final Logger LOG = LoggerFactory.getLogger(PrChartListPage.class); 

@SpringBean 
private IPrChartDSP chartDSPRealizer; 


@SuppressWarnings("rawtypes") 
private SingleSortState sortState = new SingleSortState(); 

private PrDataTable<PrChartVO, String> mChartDataTable; 

private PrProjectVO project; 


/** 
* Constructor 
*/ 
public PrChartListPage(PageParameters params) { 
    super(params); 

    project=getActiveProject(); 


    // Deal with the ChartDataTable form 
    Form<PrChartVO> lChartDataTableForm = new Form<PrChartVO>("chartDataTableForm"); 
    //  MetaDataRoleAuthorizationStrategy.authorize(lChartDataTableForm, RENDER, "USER"); 
    add(lChartDataTableForm); 

    add(new Label("subTitle", new ResourceModel("chart.title", "Chart Configurator"))); 


    // Create and add the Chart list table to the page. 
    addChartDataTable(); 

} 

private void addChartDataTable() { 
    List<IColumn<PrChartVO, String>> lColumns = new ArrayList<IColumn<PrChartVO, String>>(); 

    PrLinkPropertyColumn<PrChartVO> lChartNameColumn = new PrLinkPropertyColumn<PrChartVO>(
      new ResourceModel("chart.headerName"), "chart_name", "chart_name"){ 
       private static final long serialVersionUID = 1L; 

       @Override 
       public void onClick(Item<ICellPopulator<PrChartVO>> cellItem, String componentId, 
         IModel<PrChartVO> model, AjaxRequestTarget target) { 
        // TODO Auto-generated method stub 
        Object o = model.getObject(); 
        if(o instanceof PrChartVO){ 
         PrChartVO chart = (PrChartVO)o; 
         System.err.println("Chart: "+ chart.getChart_name()+" "+chart.getId()); 
        } 
        else 
         System.err.println("Object is no chart!!! -> " + o.getClass().getName()); 

       } 
    }; 
    lColumns.add(lChartNameColumn); 


    PropertyColumn<PrChartVO, String> lChartTitleColumn = new PropertyColumn<PrChartVO, String>(new ResourceModel(
      "chart.headerTitle"), "title_text", "title_text"); 
    lColumns.add(lChartTitleColumn); 

    PropertyColumn<PrChartVO, String> lChartTypeColumn = new PropertyColumn<PrChartVO, String>(new ResourceModel(
      "chart.headerChartType"), "chartTypeVO.type", "chartTypeVO.type"); 
    lColumns.add(lChartTypeColumn); 

    PropertyColumn<PrChartVO, String> lXaxisTypeColumn = new PropertyColumn<PrChartVO, String>(
      new ResourceModel("chart.xaxisType"), "xAxisVO.name", "xAxisVO.name"); 
    lColumns.add(lXaxisTypeColumn); 

    mChartDataTable = new PrDataTable<PrChartVO, String>("chartDataTable", lColumns, new ChartDataProvider(), PrConstants.pageSize, "100%"); 

    mChartDataTable.setOutputMarkupId(true); 
    //  MetaDataRoleAuthorizationStrategy.authorize(mChartDataTable, RENDER, "USER"); 
    add(mChartDataTable); 

} 

@Override 
protected void onBeforeRender() { 

    super.onBeforeRender(); 
} 

private final class ChartDataProvider implements ISortableDataProvider<PrChartVO, String> { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public Iterator<? extends PrChartVO> iterator(long first, long count) { 

     if(project==null) 
      System.err.println("Chart Iterator: Project is null"); 
     List<PrChartVO> lChartList = chartDSPRealizer.loadAllChartVOs(project); 
     for (PrChartVO lChartVO : lChartList) {    
      if (lChartVO.getxAxisVO() != null && lChartVO.getxAxisVO().getName() != null) { 
       String lXaxisName = new ResourceModel(lChartVO.getxAxisVO().getName()).getObject();     
       lChartVO.getxAxisVO().setName(lXaxisName); 
      } 
     } 
     return lChartList.subList((int)first, (int)(first + count)).iterator(); 
    } 

    @Override 
    public long size() { 

     int lRet = 0; 
     if(project!=null) 
      lRet = chartDSPRealizer.getChartCount(project); 
     return lRet; 
    } 

    @Override 
    public IModel<PrChartVO> model(PrChartVO object) { 
     return new Model<PrChartVO>(object); 
    } 

    @Override 
    public void detach() { 
     // Ignore   
    } 

    @SuppressWarnings({ "unchecked", "rawtypes" }) 
    @Override 
    public ISortState getSortState() { 
     return sortState; 
    } 
} 

} 

これは私はちょうど私が(私たちは6.19を使用している)改札するのは比較的新しいだと言及したいと思います

public abstract class PrLinkPropertyColumn<T> extends FilteredPropertyColumn<T, String> { 

public PrLinkPropertyColumn(IModel<String> displayModel, IModel<T> labelModel) { 
    super(displayModel, null); 
} 

public PrLinkPropertyColumn(final IModel<String> displayModel, final String sortProperty, 
     final String propertyExpression) { 
    super(displayModel, propertyExpression, sortProperty); 
} 

public PrLinkPropertyColumn(IModel<String> displayModel, String propertyExpressions) { 
    super(displayModel, propertyExpressions); 
} 

@Override 
public void populateItem(Item<ICellPopulator<T>> cellItem, String componentId, IModel<T> rowModel) { 
    cellItem.add(new LinkPanel(cellItem, componentId, rowModel)); 
} 

/** 
* Override this method to react to link clicks. Your own/internal row id 
* will most likely be inside the model. 
*/ 
public abstract void onClick(Item<ICellPopulator<T>> cellItem, String componentId, IModel<T> model, 
     AjaxRequestTarget target); 

public class LinkPanel extends Panel { 

    public LinkPanel(final Item<ICellPopulator<T>> cellItem, final String componentId, final IModel<T> model) { 
     super(componentId); 

     AjaxLink<T> link = new AjaxLink<T>("link") { 

      @Override 
      public void onClick(AjaxRequestTarget target) { 
       System.out.println("This method is never invoked"); 
       PrLinkPropertyColumn.this.onClick(cellItem, componentId, model, target); 
      } 
     }; 
     link.add(new Label("label", getDataModel(model))); 
     add(link); 
    } 
} 

/* 
* (non-Javadoc) 
* 
* @see org.apache.wicket.extensions.markup.html.repeater.data.table.filter. 
* IFilteredColumn#getFilter(java.lang.String, 
* org.apache.wicket.extensions.markup 
* .html.repeater.data.table.filter.FilterForm) 
*/ 
@Override 
public Component getFilter(String componentId, FilterForm<?> form) { 
    return new TextFilter<T>(componentId, getFilterModel(form), form); 
} 

protected IModel<T> getFilterModel(final FilterForm<?> form) { 
    return new PropertyModel<T>(form.getDefaultModel(), getPropertyExpression()); 
} 
} 

LinkPropertyColumnクラスであるとことを私は既存のプロジェクトを続行しなければなりません(そして、私はもう誰も質問しません)。したがって、私は知らないいくつかのCSSや何かがあるかもしれません。これが私が検索しなければならない設定の種類についてのヒントを私に与えることができれば、私が感謝する理由であれば。

+0

最初に、ブラウザのネットワークモニタで、リンクをクリックしたときにリクエストが送信されるかどうかを確認します。 – svenmeier

+0

その後、ListenerInterfaceRequestHandler#respond()にブレークポイントを設定し、このリクエストでWicketがやっていることをデバッグします。 – svenmeier

+0

私は私の問題を解決することができました。残念ながら、ソリューションを提供することはできません。なぜなら、ゼロから始めたばかりで、現在は同じコードで終わったからです。マジック:-))ご協力いただきありがとうございます。 –

答えて

0

同様の問題が発生したときに、親コンポーネントがリンクを無効にしていることが判明しました。彼らはリンク(青いテキスト)のように見えましたが、スクロールオーバー、クリックなどには全く反応しませんでした。

関連する問題