私は現在、Twitter Bootstrap CSS フレームワークを使用するためのヘルパー メソッドを多数備えた独自の Component ベース クラスを作成しています (そして、その周りのボイラープレート コードをすべて回避しています)。これらは、既存のフォーム ヘルパー ( などhtml div ...
) と非常によく似た方法で使用できます。
たとえば、水平テキスト フィールド (水平形式) の場合は次のようになります。
horizontalTextField: aLabel
| field |
field := WATextInputTag new
class: 'input-xlarge';
yourself.
self html div
class: 'control-group';
with: [
self html label
class: 'control-label';
with: aLabel.
self html div
class: 'controls';
with: [self html brush: field].
].
^ field.
コンポーネントをレンダリングするときに、次のように使用することを目指しています。
(self horizontalTextField: 'Titel')
on: #title of: self article;
id: 'title'.
したがって、目的は、実際のテキスト フィールドをいくつかの div でラップすることですが、上記のように、ヘルパー関数の外部で (通常のタグ ヘルパー アクセサーを使用して) このラップされた要素を変更できるようにすることです。
ただし、要素を返す前にメソッドがラッピング div をシリアル化 (別名レンダリング) するため、これは機能しませwith:
ん。要素は編集できなくなります。
考えられる解決策:
- フィールドのレンダリングに使用される WACanvasTag サブクラスを実際に拡張し、コンポーネント クラスのカスタム ヘルパーでそれらの新しいサブクラスのインスタンスを作成します。喜んでレンダリング コードを上書きするだけです。これはおそらく最もオブジェクト指向の方法ですが、特に、これらのサブクラスのすべての要素の前後に独自の HTML を挿入するために非常に多くのコードを繰り返さなければならないため、非常に困難です (ラップしようとしている Tag クラスから継承する必要があります)。
- ヘルパーを呼び出すときは、次のようにし
self horizontalTextField: 'Titel' with: [:field | id: 'title']
ます。ブロックは、ヘルパー メソッドで実際のテキスト フィールドをレンダリングする前に適用されます。これは非常に柔軟ですが、あまりきれいではありません (構文的に)。 - ヘルパー関数でラッピング HTML (この質問に関連) をハードコーディングします。このように:
self html html: '<label class="control-label">
など。ある意味でかなりのハックであり、あまりオブジェクト指向ではありません。
コメント? アイデア?より良い提案?