[英]Ember Octane How to Clear Form Errors?
This question is related to Ember Octane How to Get Error Messages to be Displayed?这个问题与Ember Octane 如何获取要显示的错误消息有关?
Question: What is the correct way to clear form errors and how do I do it?问题:清除表单错误的正确方法是什么,我该怎么做? I want this to run everytime the user comes to the form.我希望每次用户访问表单时都运行它。 The form errors are generated in the Controller JS file.表单错误在 Controller JS 文件中生成。 The use case is as follows:用例如下:
In Ember Classic, I am able to clear form errors within the component JS file using the following code snippet:在 Ember Classic 中,我可以使用以下代码片段清除组件 JS 文件中的表单错误:
import { A } from '@ember/array';从'@ember/array'导入{A};
...
init() {
this._super(... arguments);
this.set('errors', A([]));
},
However, in Ember Octane, I get the following ESLint error:但是,在 Ember Octane 中,我收到以下 ESLint 错误:
Don't use
this._super
in ES classes ember/no-ember-super-in-es-classes不要在 ES 类 ember/no-ember-super-in-es-classes 中使用this._super
I tried changing the code snippet to:我尝试将代码段更改为:
import { A } from '@ember/array';
...
init() {
super(... arguments);
this.set('errors', A([]));
}
Unfortunately, I get the following error:不幸的是,我收到以下错误:
super() is only valid inside a class constructor of a subclass. super() 仅在子类的 class 构造函数内有效。 Maybe a typo in the method name ('constructor') or not extending another class?可能是方法名称中的拼写错误(“构造函数”)或没有扩展另一个 class?
Code代码
Template Component HBS:模板组件 HBS:
<div class="middle-box text-center loginscreen animated fadeInDown">
<div>
<h3>Change Password</h3>
<form class="m-t" role="form" {{on "submit" this.changePassword}}>
{{#each @errors as |error|}}
<div class="error-alert">{{error.detail}}</div>
{{/each}}
<div class="form-group">
<Input @type="password" class="form-control" placeholder="Old Password" @value={{this.oldPassword}} required="true" />
</div>
<div class="form-group">
<Input @type="password" class="form-control" placeholder="New Password" @value={{this.newPassword}} required="true" />
</div>
<div class="form-group">
<Input @type="password" class="form-control" placeholder="Confirm Password" @value={{this.confirmPassword}} required="true" />
</div>
<div>
<button type="submit" class="btn btn-primary block full-width m-b">Submit</button>
</div>
</form>
</div>
</div>
Template HBS:模板哈佛商学院:
<Clients::ChangePasswordForm @changePasswordModel={{this.model}} @changePassword={{action 'changePassword'}} @errors={{this.errors}} />
Component JS:组件 JS:
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { action } from '@ember/object';
export default class ChangePasswordForm extends Component {
constructor() {
super(...arguments);
this.errors = []
}
@tracked oldPassword;
@tracked newPassword;
@tracked confirmPassword;
@tracked errors;
@action
changePassword(ev) {
ev.preventDefault();
this.args.changePassword({
oldPassword: this.oldPassword,
newPassword: this.newPassword,
confirmPassword: this.confirmPassword
});
}
}
Controller JS Controller JS
import Controller from '@ember/controller';
import { inject as service } from '@ember/service';
import { action } from '@ember/object';
export default class ChangePassword extends Controller {
@service ajax;
@service session;
@action
changePassword(attrs) {
if(attrs.newPassword == attrs.oldPassword)
{
this.set('errors', [{
detail: "The old password and new password are the same. The password was not changed.",
status: 1003,
title: 'Change Password Failed'
}]);
}
else if(attrs.newPassword != attrs.confirmPassword)
{
this.set('errors', [{
detail: "The new password and confirm password must be the same value. The password was not changed.",
status: 1003,
title: 'Change Password Failed'
}]);
}
else
{
let token = this.get('session.data.authenticated.token');
this.ajax.request(this.store.adapterFor('application').get('host') + "/clients/change-password", {
method: 'POST',
data: JSON.stringify({
data: {
attributes: {
"old-password" : attrs.oldPassword,
"new-password" : attrs.newPassword,
"confirm-password" : attrs.confirmPassword
},
type: 'change-passwords'
}
}),
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/vnd.api+json',
'Accept': 'application/vnd.api+json'
}
})
.then(() => {
this.transitionToRoute('clients.change-password-success');
})
.catch((ex) => {
this.set('errors', ex.payload.errors);
});
}
}
}
I have posted an Ember-Twiddle:我发布了一个 Ember-Twiddle:
https://ember-twiddle.com/364eaf05a2e1072994b61f255032eb62?openFiles=templates.application%5C.hbs%2C https://ember-twiddle.com/364eaf05a2e1072994b61f255032eb62?openFiles=templates.application%5C.hbs%2C
classic ember was经典的余烬是
init() {
this._super(...arguments);
}
ember Octane uses classe constructor ember Octane 使用类构造函数
constructor() {
super(...arguments);
}
Ember.js Octane vs Classic Cheat Sheet Ember.js 辛烷值与经典备忘单
look at this examle i made: example看看我做的这个例子: 例子
i have edited your twiddle file, i added a clearErrors action to the controller,我已经编辑了你的旋转文件,我在 controller 添加了一个 clearErrors 操作,
@action
clearErrors(){
this.set('errors',[]);
}
then a passed it as argument to the component,然后将它作为参数传递给组件,
<Clients::ChangePasswordForm @changePasswordModel={{this.model}} @changePassword={{action 'changePassword'}}
@clearErrors={{action 'clearErrors'}}
@errors={{this.errors}} />
then on each init of component i call clearErrors,然后在组件的每个初始化上,我调用 clearErrors,
constructor() {
super(...arguments);
this.args.clearErrors();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.