0

モデルのリストを Http.context に保存すると、ビューでループできません。

インデックス アクション :

@With(MembershipAction.class)
public static Result index() {
...

アクション構成:

public class MembershipAction extends Action.Simple {
@Override
public Result call(Context ctx) throws Throwable {

    Member member = Membership.getUser();
    if (member != null) {
        // MGroup.findInvolving(member)= List<play.db.ebean.Model> 
        // code : find.where().eq("members.id", member.id).findList();
        ctx.args.put("groups", MGroup.findInvolving(member));
    }
    return delegate.call(ctx);
}
}

テンプレート ビュー #1​​ :

@ctx().args.get("groups")

出力: BeanList size[6] hasMoreRows[false] リスト[models.MGroup@51、models.MGroup@3d、models.MGroup@2a、models.MGroup@29、models.MGroup@15、models.MGroup@1]

テンプレート ビュー #2 (機能していません) :

@for(group <- ctx().args.get("groups") ){
    @group.name
}

出力 : コンパイル エラー / 値マップはオブジェクトのメンバーではありません

注: ここで説明する方法も機能しませんでした: play2 のどこにでもパラメータを渡さないようにするには?

スニペット「@Menus」の試行は不明でした...

4

1 に答える 1

0

ctx().args文字列からオブジェクトへのマップを提供します。したがって、このマップから何かを取得すると、タイプは になりObjectます。オブジェクトをループしようとしているため、テンプレートのコンパイルに失敗したと思います。

これを修正する最も簡単な方法は、テンプレートでキャストを実行することです。

@for(group <- ctx().args.get("groups").asInstanceOf[List[models.MGroup]]) {
  @group.name
}

私の意見では、より良い修正は次のとおりです。

  1. テンプレート #2 を変更して、モデル オブジェクトのリストを入力パラメーターとして受け取ります。Play ドキュメントのテンプレート構文、特にテンプレート入力パラメーターの定義方法を見てください。
  2. このテンプレートをレンダリングする Java アクションを変更して、モデル オブジェクトのリストを Java ランドの HTTP コンテキストから取得し、レンダリング時にそれらをテンプレートに渡します (null チェックと型チェックを行った後)。

このようにして、コードはコンテキストにないデータに対してより堅牢になり、テンプレートで型の安全性を維持することもできます。リストは入力パラメーターとしてテンプレートに入力されるため、テンプレートを調べる必要ctx().argsはなく、キャストを実行する必要もありません。

于 2013-08-24T15:24:54.613 に答える