人们如何处理客户端验证和余烬?
是否有任何开箱即用的插件或处理验证的插件,或者人们只是自己滚动?
我会扩展 Ember.TextField (或您验证的任何输入类型)并将 classBinding 与计算属性一起使用。这是示例:http: //jsfiddle.net/caligoanimus/7UNRd/
模板:
<script type="text/x-handlebars" >
{{view App.AlphaNumField
placeholder="alpha-numeric data only"
valueBinding="App.alphaNumInput"}}
</script>
应用:
App = Ember.Application.create({
AlphaNumField: Ember.TextField.extend({
isValid: function() {
return /^[a-z0-9]+$/i.test(this.get('value'));
}.property('value'),
classNameBindings: 'isValid:valid:invalid'
})
});
如果您使用引导程序,另一个完全受支持且非常合乎逻辑的选项是使用bootstrap-validation plugin。在 ember (ember-cli) 中,这应该使用 bower 安装:
bower install --save bootstrap-validation
然后在 ember-cli-build 中,您必须导入依赖项:
//bootstrap-validator
app.import('bower_components/bootstrap-validator/dist/validator.js');
app.import('bower_components/bootstrap-validator/dist/validator.min.js');
该解决方案允许您在 html 级别进行验证,让引导程序完成“脏”工作。对于标准验证,这将简单而轻松地完成工作。
我一直在以与@caligoanimus 非常相似的方式处理它,但验证文本框外的焦点并附加错误消息。
代码:
App.TextFieldEmpty = Ember.TextField.extend({
focusOut: function() {
var valid = this.get('value') ? valid = true : valid = false;
this.$().next(".err").remove();
if(!valid){
this.$().addClass("invalid").after("<span class='err'>This field is required</span>");
} else {
this.$().removeClass("invalid")
}
}
});
模板:
<script type="text/x-handlebars">
{{view App.TextFieldEmpty}}
</script>
JSBIN:
App.MyView = Ember.View.extend({
templateName: 'my-form-template',
didInsertElement: function(){
$("#myForm").validate({
rules:{
fname:{
required: true,
maxlength: 50,
},
lname:{
required: true,
maxlength: 50,
},
email: {
required: true,
email: true,
maxlength: 200,
},
},
messages: {
email: {
email: "Enter a valid email address.",
},
},
});
}
});
只需使用 Ember 输入助手,它就使我的表单验证非常干净。您可以使用 jQuery Validate 脚本并将其作为函数放入 .js 文件中,然后在 didInsertElement 上调用它。
jQuery Validate 在您的字段下方添加错误消息以及与规则相关的消息,还允许您通过 .valid() 方法从您的任何操作或事件触发验证。
我们创建了自己的文本字段,这些文本字段会在聚焦时引发验证错误,并且其他事件和其他文本字段会扩展它们:
App.PhoneNumberField = App.TextField.extend({
validate: function(value) {
var self = this.$('input');
var id = self.attr("id");
var e164PhoneNumber = formatE164("AU",value);
var valid = true;
if(self.val().trim().length == 0 ){
valid = true;
}else{
valid = isValidNumber(e164PhoneNumber);
}
if (!valid) {
self.trigger(Storm.invalidInputEvent(id));
this.setErrorMessage("error","Phone Number does not look right");
}else {
self.trigger(Storm.validInputEvent(id));
this.clearMessages();
}
},
keyUp: function(evt) {
if(evt.keyCode >= 37 && evt.keyCode <=40)
{
return;
}
var textValue = this.$("input").val();
var input = this.$().find('input');
var formattedNumber = this.formatInput(textValue);
input.val(formattedNumber);
this.set('data',formattedNumber);
},
value: function() {
var phoneNumber = this.get('data');
if (phoneNumber) {
return phoneNumber;
} else {
return "";
}
}.property('data'),
data: null,
placeholder: function() {
return "";
}.property('placeholder'),
formatInput: function(textValue){
var formattedPhoneNumber = formatLocal("AU",textValue);
return formattedPhoneNumber;
}
});
我会使用模型/持久层,它使用传统的“错误”对象来保存模型上的验证错误。
由于 Ember 在观察变化方面表现出色,我会观察变化的错误对象以确定是否应该显示验证消息。
在我当前的设置中,我使用Tower.js作为框架,因为它使用 Ember 作为视图层,并且具有强大的模型/持久层。该层允许我在模型级别定义验证。每次我尝试持久化模型时,都会对其进行验证并引发错误。在我看来,此错误会中止“理想”路径并且不会继续执行工作流,而是会在模板中呈现验证错误。