我认为这是更灵活的方法:
Javascript
Boostrap = Ember.Namespace.create();
为了简化每个事物FormControl
都有属性:标签、消息和实习控制。所以你可以扩展它并指定你想要的控件。像组合框,单选按钮等。
Boostrap.FormControl = Ember.View.extend({
classNames: ['form-group'],
classNameBindings: ['hasError'],
template: Ember.Handlebars.compile('\
<label class="col-lg-2 control-label">{{view.label}}</label>\
<div class="col-lg-10">\
{{view view.control}}\
<span class="help-block">{{view.message}}</span>\
</div>'),
control: Ember.required()
});
是其中Boostrap.TextField
一种实现,您的组件是Ember.TextField
. 因为那Boostrap.TextField
是一个实例Ember.View
而不是Ember.TextField
直接。我们使用 委托值Ember.computed.alias
,因此您可以valueBinding
在模板中使用。
Boostrap.TextField = Boostrap.FormControl.extend({
control: Ember.TextField.extend({
classNames: ['form-control'],
value: Ember.computed.alias('parentView.value')
})
});
这里没什么特别的,只需创建默认值 tagName=form 和 classNames=form-horizontal,因为每次都不记得。
Boostrap.Form = Ember.View.extend({
tagName: 'form',
classNames: ['form-horizontal']
});
创建一个子类 Boostrap.Form
并将验证委托给控制器,因为它必须是关于验证的知识。
App.LoginFormView = Boostrap.Form.extend({
submit: function() {
debugger;
if (this.get('controller').validate()) {
alert('ok');
}
return false;
}
});
这是执行验证逻辑和处理的地方。所有使用绑定而不需要触摸 dom。
App.IndexController = Ember.ObjectController.extend({
value: null,
message: null,
hasError: Ember.computed.bool('message'),
validate: function() {
this.set('message', '');
var valid = true;
if (!/^[a-z0-9]+$/i.test(this.get('value'))) {
this.set('message', 'Just numbers or alphabetic letters are allowed');
valid = false;
}
return valid;
}
});
模板
<script type="text/x-handlebars" data-template-name="index">
{{#view App.LoginFormView}}
{{view Boostrap.TextField valueBinding="value"
label="Alpha numeric"
messageBinding="message"
hasErrorBinding="hasError"}}
<button type="submit" class="btn btn-default">Submit</button>
{{/view}}
</script>
这里有一个现场演示
更新
就像@intuitivepixel 所说,ember-boostrap 已经实现了这个。因此,如果您不想在 ember-boostrap 中有依赖项,请考虑我的示例。