如何在不立即触发验证的情况下绑定模型 属性(来自控制器)?
How to bind a model property (from controller) without it firing validation right away?
我有一个简单的模型支持控制器,对全名进行简单验证。我将验证添加到模型错误计算 属性 中,如下所示。它工作得很好,除了这个计算的 属性 是 "fired" 立即在呈现表单时显示 "please enter a username" 错误。
问题是-如何应该我这样做是为了获得很好的计算property/2数据绑定方式属性和错误消息但是......不会立即触发(而是等待用户先输入内容)。
var UserController = Ember.Controller.extend({
actions: {
submit: function() {
//verify model is legit ... transitionToRoute if so
}
}
});
var User = Ember.Object.extend({
enteredUsername: "",
username: function() {
var enteredUsername = this.get("enteredUsername");
return enteredUsername.trim();
}.property("enteredUsername"),
usernameError: function() {
var username = this.get("username");
if (!username) {
return "please enter a username";
}
}.property("username")
});
{{input type="text" value=model.enteredUsername}}
<span class="input-error">{{model.usernameError}}</span>
正如@Sisir 所说,您可能需要某种变量来检查模型值是否脏。这是实现它的一种方法。基本上,模型 属性 将由 value
和 isDirty
属性 组成。所以 enteredUsername
将是
enteredUsername: {
value: '',
isDirty: false
}
您修改后的代码将如下所示
var User = Ember.Object.extend({
enteredUsername: {
value: '',
isDirty: false
},
username: function() {
var value = this.get("enteredUsername.value").trim();
//Once dirty is set, then dont reset.
if(!this.get('enteredUsername.isDirty')) {
this.set('enteredUsername.isDirty', value.length > 0);
}
return value;
}.property('enteredUsername.value'),
usernameError: function() {
var username = this.get("username");
var isDirty = this.get('enteredUsername.isDirty');
if (!username && isDirty) {
return "please enter a username";
}
}.property('username', 'enteredUsername.isDirty')
});
我有一个简单的模型支持控制器,对全名进行简单验证。我将验证添加到模型错误计算 属性 中,如下所示。它工作得很好,除了这个计算的 属性 是 "fired" 立即在呈现表单时显示 "please enter a username" 错误。
问题是-如何应该我这样做是为了获得很好的计算property/2数据绑定方式属性和错误消息但是......不会立即触发(而是等待用户先输入内容)。
var UserController = Ember.Controller.extend({
actions: {
submit: function() {
//verify model is legit ... transitionToRoute if so
}
}
});
var User = Ember.Object.extend({
enteredUsername: "",
username: function() {
var enteredUsername = this.get("enteredUsername");
return enteredUsername.trim();
}.property("enteredUsername"),
usernameError: function() {
var username = this.get("username");
if (!username) {
return "please enter a username";
}
}.property("username")
});
{{input type="text" value=model.enteredUsername}}
<span class="input-error">{{model.usernameError}}</span>
正如@Sisir 所说,您可能需要某种变量来检查模型值是否脏。这是实现它的一种方法。基本上,模型 属性 将由 value
和 isDirty
属性 组成。所以 enteredUsername
将是
enteredUsername: {
value: '',
isDirty: false
}
您修改后的代码将如下所示
var User = Ember.Object.extend({
enteredUsername: {
value: '',
isDirty: false
},
username: function() {
var value = this.get("enteredUsername.value").trim();
//Once dirty is set, then dont reset.
if(!this.get('enteredUsername.isDirty')) {
this.set('enteredUsername.isDirty', value.length > 0);
}
return value;
}.property('enteredUsername.value'),
usernameError: function() {
var username = this.get("username");
var isDirty = this.get('enteredUsername.isDirty');
if (!username && isDirty) {
return "please enter a username";
}
}.property('username', 'enteredUsername.isDirty')
});