0

私は次のようなクラスを持っています:

class Foo {
    name
    description

    static constraints = {
        name()
        description()
    }
}

クラスの表示インスタンスをFlexigridに追加したい。データがflexigridに送信されるときは、JSONやXMLなどの形式である必要があります...私はJSONを選択しました。Flexigridは、受信するJSON配列が次の形式であることを想定しています。

{
    "page": "1",
    "total": "1",
    "rows": [
        {
            "id": "1",
            "cell": [
                "1",
                "The name of Foo 1",
                "The description of Foo 1"
            ]
        },
        {
            "id": "2",
            "cell": [
                "2",
                "The name of Foo 2",
                "The description of Foo 2"
            ]
        }
    ]
}

Fooオブジェクトをこの形式にするために、次のようなことを行います。

def foos = Foo.getAll( 1, 2 )

def results = [:]
results[ "page" ] = params.page
results[ "total" ] = foos.size()
results[ "rows" ] = []

for( foo in foos ) {
    def cell = []
    cell.add( foo.id )

    foo.getProperties().each() { key, value -> // Sometimes get foo.getProperties().each() returns foo.description then foo.name instead of foo.name then foo.description as desired.
        cell.add( value.toString() )
    }

    results[ "rows" ].add( [ "id": foo.id, "cell": cell ] )
}

render results as JSON

問題は、たまにfoo.getProperties().each()戻っfoo.descriptionて、 foo.nameflexigridfoo.descriptionの名前列にfoo.name入れられ、特定の行のflexigridの説明列に入れられることです。

Fooドメインクラスで制約を指定してgetProperties、が正しい順序で返されるようにしましたが、機能しませんでした。 予測可能な順序でプロパティを返すようにするにはどうすればよいですか?getProperties

これは私がこの問題を修正した方法です:

def items = Foo.getAll()

for( item in items ) {
    def cell = []
    cell.add( item.id )
    Foo.constraints.each() { key, value ->
        def itemValue = item.getProperty( key )
        if( !( itemValue instanceof Collection ) ) {
            cell.add( itemValue.toString() )
        }
    }
}

したがってFoo.constraints、各制約がのインスタンスである制約のマップを取得しますCollections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry。テストの結果、このマップは常に静的制約を入力した順序で返すことがわかりましFooた(Ianによっても確認されています)。これで、のプロパティのみがitemforflexigridにFoo.constraints追加されます。cell

4

2 に答える 2

2

foo.getProperties()私は注文について何も保証しないと思います。ただしFoo.constraints、実行時にオーバーライドされて元のクロージャーは返されませんが、このマップ内MapConstrainedPropertyオブジェクトとキーは、制約クロージャーと同じ順序であること保証されます(これにより、scaffoldは制約の順序を使用して順序を定義できます)フィールドはスキャフォールドビューに表示されます)。だからあなたは次のようなことをすることができます

def props = [:] // [:] declares a LinkedHashMap, so order-preserving
Foo.constraints.each { k, v ->
  props[k] = foo."${k}"
}
于 2012-06-22T11:35:33.243 に答える
0

foo.getProperties().sort()または、必要な順序でプロパティを並べ替える適切な方法がない場合は、リストでプロパティの順序を自分で定義して、繰り返し処理することができます。

def properties = ['name', 'description']
properties.each {
     cell.add(foo."$it")
}
于 2012-06-22T05:23:56.680 に答える