我目前正在编写自己的 Component 基类,其中包含一大堆帮助方法,用于使用 Twitter Bootstrap CSS 框架(并避免其周围的所有样板代码)。它们可以非常像现有的表单助手(如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 中,但仍然能够在辅助函数之外(使用普通的标签辅助访问器)对这个被包装的元素进行更改,如上所示。
但是,这不起作用,因为该with:
方法会导致包装 div 在我返回元素之前被序列化(也就是渲染),然后我无法再对其进行编辑。
可能的解决方案:
- 实际上扩展了用于呈现字段的 WACanvasTag 子类,并在我的组件类的自定义助手中创建这些新子类的实例。为了我的快乐,我会简单地覆盖他们的渲染代码。这可能是最面向对象的做事方式,但相当艰巨,尤其是因为我必须重复大量代码才能在这些子类中的每一个的元素之前和之后插入我自己的 HTML(如他们已经必须从我试图包装的 Tag 类继承)。
- 调用助手时,请执行类似
self horizontalTextField: 'Titel' with: [:field | id: 'title']
. 然后将在辅助方法中呈现实际文本字段之前应用该块。这将非常灵活,但不是很漂亮(语法方面)。 - 在我的辅助函数中硬编码包装 HTML(与此问题相关)。像这样:
self html html: '<label class="control-label">
等等。在某种程度上,相当的黑客,而不是非常面向对象。
注释?想法?更好的建议?