0

もちろん、私の最初の Grails プロジェクトでは、私のデータ モデルと UI デザイナーが望むプレゼンテーションとの間に狂ったような不一致が生じることがあります。

問題空間の簡略化されたステートメントは次のとおりです。

食料品店には、にんじん、セロリ、トマトの 3 つの材料があります。このアプリの目的は、ユーザーの買い物リストを保存することです。つまり、それぞれ何個買うかです。

Web デザイナーは、複数の HTML SELECT でこれを実現したいと考えているため、ドロップダウンから購入する材料を選択し、その横に数量を入力します。さらに成分が必要な場合は、さらに SELECT を追加する JavaScript リンクをクリックします。

設計では、各ドロップダウンが同じであり、行数が無制限であることを指定しています。したがって、3 つのニンジン、9 つのセロリ、2 つのセロリ、5 つのニンジン、および 1 つのトマトに対応する 5 つの行を持つフォームを取得できます。

これから私が生産する「べき」ものは、​​ニンジン 8 個、セロリ 11 個、トマト 1 個の注文です。

なぜこれが悪い UI 設計であるかについてのすべての議論に入るわけではありませんが、実際には、この種の不一致を考慮してモデル/コントローラーをビューにマップし、保存された送信を送信して最終的に編集する方法を理解したいと思います。

私の最初のアイデアは次のとおりです。

  • インバウンドデータの場合、パラメーターといくつかのロジックからコントローラーで新しいマップを構築し、値を 3 つの新しいキーと値のペアに正しく追加し、その新しいマップをリクエストパラメーターマップ自体ではなく bindData メソッドに渡します。
  • ビューを編集用に表示するには、afterInterceptor を使用して、モデルのその部分をこれらの SELECT の正しい数に書き換えます。元の 5 行の注文が、編集用に表示されると 3 行になることを認識してください。

しかし、Command オブジェクトについて読んでいると、それがより良いアプローチになるのではないかと思います。

オンラインで多くのページを読みましたが、この種の MVC の不一致に対する解決策は見当たりません。

明らかな答え (デザイナーと戦う) は別として、これを処理する "Grails" の方法は何ですか?

4

1 に答える 1

0

あなたの最初のアイデアはうまくいくはずだと思います。コマンド オブジェクトは、ドメイン オブジェクトを構築するロジックをコントローラー メソッドから移動するのに適していますが、必須ではありません。shoppingList にさらに情報 (名前、日付など) を追加すると、コードが読みやすくなり、検証が簡単になります。しかし、cmdオブジェクトのないものは機能するはずであり、間違っているとは思いません...

GSP:

<g:form .......>
<div><g:select name="ingredient" from="${['Carrots','Celery','Tomato']}"><g:textField name="amount"/></div>
<div><g:select name="ingredient" from="${['Carrots','Celery','Tomato']}"><g:textField name="amount"/></div>
<div><g:select name="ingredient" from="${['Carrots','Celery','Tomato']}"><g:textField name="amount"/></div>
<div><g:select name="ingredient" from="${['Carrots','Celery','Tomato']}"><g:textField name="amount"/></div>
</g:form>

コントローラ:

def saveCart = {
  def shoppingList = [:]
  def ingredients = params.list('ingredient')
  def amounts = params.list('amount')

  ingredients.eachWithIndex() { obj, i ->
     if (shoppingList.containsKey(obj)) {
       shoppingList[obj] = shoppingList[obj] + amounts[i]
     } else {
       shoppingList[obj] = amt[i]
     }
  }

  // shoppingListshould have everything you need now
  ....
  ....
}
于 2011-04-22T20:37:27.790 に答える