简体   繁体   English

Ember Octane 如何清除表单错误?

[英]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:用例如下:

  1. User navigates to form用户导航到表单
  2. User provides erroneous input, resulting in errors to be displayed用户输入错误,导致显示错误
  3. User navigates away from the form and does something else用户离开表单并执行其他操作
  4. User comes back to the form and the existing errors re-display (I do not want this to happen)用户返回表单并重新显示现有错误(我不希望发生这种情况)

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM