2011-06-21 12 views
2

タペストリーの選択メニューにアクションを追加しようとしています。私は現在selectModelFactoryを注入し、それにハイバネートクエリからのリストを提供することによってselectメニューを生成しています。与えられた選択肢が希望の選択肢を提示していないときに、 "+新しい項目の追加"のようなメニューを追加したいとします。 + Add New Itemを選択すると、onValueChangedメソッドを使用して新しいオブジェクトを取得し、ゾーンを返そうとしました。私はこの仕事をすることができませんでした。誰かが私を正しい方向に向けることができますか?私はこのオブジェクトがデータベースにコミットされないようにする必要があります。これにより、既存のリストに追加しないでください。Tapestry 5選択メニューにアクションを追加します。

void onPrepare() { 
    List<MyClass> results = session.createCriteria(MyClass.class).list(); 

    MyClass tempObject = new MyClass(); 
    tempObject .setName("+ Add New Item"); 
    results.add(tempObject); 
    selectModel = selectModelFactory.create(results, "label"); 
} 

public Object onValueChanged(MyClass myClass) { 
    if(myClass!= null && myClass.getName().equals("+ Add New Item")) { 
     return myZone.getBody(); 
    } 
    return null; 
} 
+0

あなたが使用しているタペストリーのバージョンは何? valueChangedイベントハンドラは、5.2以降の選択ボックスに対してのみ呼び出されます。 – Jeshurun

答えて

2

このworking exampleをご覧ください。イベントハンドリング方法の名前が正しくないので、onValueChangedNameOfYourSelect(MyClass value)にする必要があります。または、私が使用するのが好ましいのはOnEvent注釈です。

1

こんにちは、ナブブルhttp://tapestry.1045711.n5.nabble.com/T5-Select-Menu-with-Other-Option-td4520881.html#a4529383の議論のメーリングリストを参照してください。以下は解決策に終わったが、他の選択肢が保存されるのを妨げて他の複雑さを提示した。

@Property 
private Funding funding; 

@Property 
@Persist 
private SelectModel fundingModel; 

@InjectComponent 
private Zone fundingZone; 

final private static Funding NEW_FUNDING = new Funding(); 
final private static String NEW_FUNDING_ID = "-1"; 

void onPrepare() { 
    fundings = session.createCriteria(Funding.class).list(); 
    NEW_FUNDING.setName("+ Other"); 
    fundings.add(NEW_FUNDING); 

    fundingModel = selectModelFactory.create(fundings, "label"); 

} 

@CommitAfter 
void onSuccess() { 
    //you would want to add some sort of logic to prevent the "Other" object from being commited. 
} 

public ValueEncoder<Funding> getEncoder() { 
    final ValueEncoder<Funding> encoder = valueEncoderSource.getValueEncoder(Funding.class); 
    return new FundingValueEncoder(encoder); 
} 

final private static class FundingValueEncoder implements ValueEncoder<Funding> { 
    final private ValueEncoder<Funding> delegate; 

    public FundingValueEncoder(ValueEncoder<Funding> delegate) { 
     this.delegate = delegate; 
    } 

    public String toClient(Funding value) { 
     if (value == NEW_FUNDING) { 
      return NEW_FUNDING_ID; 
     } else { 
      return delegate.toClient(value); 
     } 
    } 

    public Funding toValue(String clientValue) { 
     if (NEW_FUNDING_ID.equals(clientValue)) { 
      return NEW_FUNDING; 
     } else { 
      return delegate.toValue(clientValue); 
     } 
    } 
} 

public Object onValueChanged(Funding funding) { 
    if(funding == NEW_FUNDING) { 
     return fundingZone.getBody(); 
    } 
    return null; 
} 
関連する問題