emberjs中表单输入控件的可重用布局

时间:2013-06-01 16:13:30

标签: ember.js handlebars.js

我想创建一个视图布局,我可以将其重复用于多种表单输入控件。例如,所有表单输入都将具有:

  • 标签
  • 某种输入控制
  • 帮助文字
  • 验证错误消息的占位符

这将是整个应用程序中的一致组件。实例之间唯一会改变的是输入组件。例如,它可以是文本字段,文本区域,选择,单选按钮等等。

似乎可以将其解压缩到某种模板中,然后换掉输入控制位:

<label {{bindAttr for=view.someId}}>{{view.label}}</label>
{{something-goes-here}}
<span class="help-inline">{{view.help}}</span>
<span class="validation">{{view.validation}}</span>

我不确定这是否可能。看起来可能是一种视图布局,但由于某些原因,不允许自闭标签具有布局,因此:

{{view Ember.TextField layout=myControlLayout ...}}

是不可能的(作为旁注,为什么会这样?)

是否可以仅使用视图执行此操作?或者车把帮手会更合适吗?

我的问题与this one非常相似,但不同之处在于我希望能够将我的观点用于任何内容。

1 个答案:

答案 0 :(得分:2)

鉴于设置输入元素的布局是不行的(我不确定为什么会这样),我建议您创建一个具有所需布局的视图,并使用它来包装每个输入控件你的模板。 {{yield}}帮助器标记输入控件的位置。

模板:

<script type="text/x-handlebars" data-template-name="input-control">
    <label {{bindAttr for=view.inputId}}>{{view.label}}</label>
    {{yield}}
    <span class="help-inline">{{view.help}}</span>
    <span class="validation">{{view.validation}}</span>
</script>

查看:

App.FormElementView = Ember.View.extend({
    layoutName: 'input-control',

    // defaults
    inputId: '',
    label: 'Input:',
    help: 'Enter text above.',
    validation: ''
});

每当您引入输入控件时,请将其包装在此视图中。在开始{{view}}标记中覆盖您想要的任何默认值。

<script type="text/x-handlebars" data-template-name="index">  
    {{#view App.FormElementView 
      label="My input:"
      help="This is where the input goes"
      inputId="my_input"
      validationBinding="validation"}}

        {{input value=value id="my_input"}}

    {{/view}}
</script>

在这种情况下,我将验证字符串映射到控制器中的计算属性。

App.IndexController = Ember.Controller.extend({
    value: "",
    validation: function() {
        return $.trim(this.get('value')).length > 0 ? 'Looks good.' : 'Type something.';            
    }.property('value')
});

Here's the jsfiddle.