如何将表单变成 ember 组件?

How do I turn my form into an ember component?

我有这个表格:

<form {{action 'resetPassword' on="submit"}}>
  {{input type="password" value=newPassword placeholder="reset password"}}<br>
  {{#if newPassword}}
    {{input type="password" value=confirmPassword placeholder="confirm password"}}
    {{#if passwordOK}}
      <button>Reset</button>
    {{/if}}
  {{/if}}
</form>

它依赖于可用的 resetPassword 操作以及 passwordOK 函数,该函数测试密码是否已输入且确认是否匹配。

这一切都很棒,但我认为我需要在我的应用程序中多次使用此表单。所以我想我应该把它做成一个组件。

如何将此表单变成可重用的组件?

我对如何利用这一块功能并使其在我的应用程序中可用很感兴趣。我如何打包并重新使用它?

我不确定这是否是您要找的。 基本上你的表单组件在下面声明,你可以通过调用你的组件 ID {{sign-form}}

从任何地方访问
<script type="text/x-handlebars" id="form">
    {{signup-form}}
</script>


<script type="text/x-handlebars" id="components/signup-form">
    <form {{action 'resetPassword' on="submit"}}>
      {{input type="password" value=newPassword placeholder="reset password"}}<br>
      {{#if newPassword}}
        {{input type="password" value=confirmPassword placeholder="confirm password"}}
        {{#if passwordOK}}
          <button>Reset</button>
        {{/if}}
      {{/if}}
    </form>
</script>

这个派对可能会迟到,但它可能会对其他人有所帮助。

使用 Ember CLI 创建 Ember 表单组件的 5 分钟指南

  1. 生成一个新项目 - "ember new quick-form"
  2. 导航到该目录,然后键入 - "ember g component password-component"
  3. 在您的项目目录中,转到 app > components > password-component.js。在那里,用这个替换代码:

    import Ember from 'ember';
    
    export default Ember.Component.extend({  
      passwordOK: function(){
        return this.get('newPassword')===this.get('confirmPassword');
         }.property('newPassword','confirmPassword'),
    
    actions: {  
    resetPassword: function() {  
      alert(this.get('newPassword'));  
        }    
      }  
    });  
    
  4. 转到应用 > 模板 > 组件 > 密码组件。在那里,将 {{yield}} 替换为:

    <form {{action 'resetPassword' on="submit"}}>  
      {{input type="password" value=newPassword placeholder="reset password"}}<br>  
        {{#if newPassword}}  
          {{input type="password" value=confirmPassword placeholder="confirm password"}}  
            {{#if passwordOK}}  
              {{input type="submit" value="submit"}}  
            {{else}}  
            passwords don't match  
            {{/if}}    
        {{/if}}  
    </form>  
    
  5. 在 app > templates > application.hbs 中,添加您刚刚创建的组件,只需添加以下内容:“{{password-component}}”

  6. 构建您的项目 ("ember s")

  7. 您的组件应该是可见的。将内容添加到输入字段并单击提交,应该会显示您刚刚输入的内容。

有两种常见的方式。

解决方案 1

这是最基本的解决方案。

组件 JS:

import Component from '@ember/component';
import layout from './template';

export default Component.extend({
  layout,
  tagName: 'form'
});

组件模板:

{{yield}}

用法:

{{#my-form submit=(action "resetPassword")}}
  {{input type="password" value=newPassword placeholder="reset password"}}<br>
  {{#if newPassword}}
    {{input type="password" value=confirmPassword placeholder="confirm password"}}
    {{#if passwordOK}}
      <button type="submit">Reset</button>
    {{/if}}
  {{/if}}
{{/my-form}}

调用您的 resetPassword 操作时,系统会向其传递一个事件对象,您需要对该事件调用 preventDefault()

  actions: {
    resetPassword(e) {
      e.preventDefault(); // stops page from refreshing
      // do stuff
    }
  }

解决方案 2

这是一个更复杂的例子。您可能希望在内部处理 e.preventDefault()。此组件异步提交其操作。

组件 JS:

import Component from '@ember/component';
import layout from './template';

export default Component.extend({
  layout,
  tagName: 'form',
  isSubmitting: false,
  onSubmit() { /* pass this in */ },
  submit(e) {
    e.preventDefault();

    this.set('isSubmitting', true);

    Ember.run.later(() => {
      this.set('isSubmitting', false);
      this.onSubmit();
    }, 500);
  },
});

组件模板:

{{yield (hash isSubmitting=isSubmitting)}}

用法:

{{#my-form onSubmit=(action "resetPassword") as |form|}}
  <fieldset disabled={{form.isSubmitting}}>
    {{input type="password" value=newPassword placeholder="reset password"}}<br>
    {{#if newPassword}}
      {{input type="password" value=confirmPassword placeholder="confirm password"}}
      {{#if passwordOK}}
        <button type="submit">Reset</button>
      {{/if}}
    {{/if}}
  </fieldset>
{{/my-form}}

在此示例中,您的表单将通过 form 变量将 isSubmitting 属性 传递给其父块模板。

此外,您的 resetPassword() 操作无需修改,可以保持原样。