1

最近、Wicket 1.5.11 から Wicket 6.13 にアップグレードしました。アップグレード後、リンクのオンクリック動作の問題に直面しています。

いくつかの列を含むクリック可能な行があります (そのうちの 1 つは新しいページへのリンクです)。ここで、リンクをクリックすると新しいページが表示され、行をクリックすると (リンクは別として) 行が選択されます (Ajax 呼び出しを使用)。

これは Wicket 1.5.11 では問題なく動作していましたが、Wicket 6.13 では問題に直面しています。

リンククラス:

public class MyLink extends Link {

private static final long serialVersionUID = 5808539933400105591L;
private MyRow myRow;

public MyLink(String id, MyRow myRow) {
    super(id);
    this.myRow = myRow;
}

/** {@inheritDoc} */
@Override
public void onClick() {
    //sets the response page where this needs to be redirected.
    this.setResponsePage(new ResponseReadPage(this.myRow));
}
}

移入方法:

@Override
protected void populateItem(final ListItem item) {
    final MyRow myRow = (MyRow) item.getModelObject();
    item.add(new Label("naam", myRow.getName()));
    item.add(new Label("id", myRow.getCode()));

    MyLink myLink = new MyLink("myLink", myRow);
    item.add(myLink);
    final MyRow selectedRow = this.session.getSelectedRow();

    if (selectedRow != null
            && selectedRow.equals(myRow)) {
        this.session.selectedRow(myRow);
        item.add(new AttributeModifier("class", "activeRow"));
        this.selecteditem = item;

        //some business logic
    }

    item.add(new AjaxEventBehavior("onclick") {
        /** {@inheritDoc} */
        @SuppressWarnings({ "unchecked", "rawtypes" })
        @Override
        protected void onEvent(final AjaxRequestTarget target) {
            final WebMarkupContainer container = (WebMarkupContainer) MyListView.this.getParent()
                    .getParent().get("myContainer");

            MyListView.this.session.setSelectedRow(myRow);

            if (MyListView.this.currentActiveItem != null) {
                MyListView.this.previousActiveItem = MyListView.this.currentActiveItem;
                MyListView.this.previousActiveItem.add(new AttributeModifier("class", ""));
            }
            item.add(new AttributeModifier("class", "activeRow"));
            MyListView.this.currentActiveItem = item;
            if (MyListView.this.previousActiveItem != null) {
                target.add(MyListView.this.previousActiveItem);
            }

            if (MyListView.this.selecteditem != null
                    && !MyView.this.selecteditem.equals(item)) {
                MyListView.this.selecteditem.add(new AttributeModifier("class", ""));
                target.add(MyListView.this.selecteditem);
            }
            target.add(item);
            target.add(container);
        }
    });
}

リンクの onClick メソッドではなく LINK をクリックしようとすると、行の AjaxBehavior の onclick イベントが呼び出されます。これを整理するために誰かが私を正しい方向に向けることができますか?

更新:リンクを右クリックして別のタブで開くと、リンクの onClick メソッドの呼び出しが期待どおりに正常に行われます。

4

3 に答える 3

2

これに対する解決策を見つけました。コードに次の行を追加しました。

myLink.add(new AttributeAppender(
"onclick", new Model("if(event.stopPropagation) { "+
                "event.stopPropagation();"+
                    "} else { "+"event.cancelBubble = true;"
                     +"}"), ";"));

リンクの onclick イベントが行の onclick イベントに伝播されていたため、そのような動作をしていました。

于 2015-01-13T09:36:57.053 に答える
0

私はちょうど同じ問題に遭遇しました。私のアプリケーションは 9 より前の IE バージョンをサポートしていないため ( https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagationを参照)、AttributeAppender をシンプルに保ちました。

public class EventStopPropagationAttributeAppender extends AttributeAppender {

  public EventStopPropagationAttributeAppender() {
    super("onclick", new Model<String>("event.stopPropagation();"), ";");
  }
}
于 2016-01-07T14:44:49.057 に答える