【问题标题】:emberjs: Passing selected value to select field in formemberjs:将选定的值传递给表单中的选择字段
【发布时间】:2019-09-26 02:28:59
【问题描述】:

我正在尝试使用 ember 从第一原则添加一个 SELECT 字段,并且在编辑记录时难以弄清楚如何将当前选择的选项传递给表单。

我已将表单设置为组件,并且能够在创建新记录时成功使用它,并将所选值传递给 Rails 后端。 我的问题是,在编辑现有记录时,我无法找到将此选定值应用于表单组件的方法。

这里是组件模板部分(book-form.hbs):

  <div class="form-group">
    <select id="format" onchange={{action 'updateValue' value='target.value'}}>
      <option value=""></option>
      <option value="Paperback">Paperback</option>
      <option value="Hardcover">Hardcover</option>
      <option value="E-Book">E-Book</option>
    </select>

模板代码(book-form.js):

import Component from '@ember/component';

export default Component.extend({
  actions: {
    submitChange(param) {
      this.onSave(param, this.selectedOpt);
    },
    selectedOpt: "",
    updateValue(value) {
      this.set('value', value);
      this.selectedOpt = value;
    },
  }
});

新建和编辑模板:

{{book-form onSave=(action 'saveBook') model=model}}

新控制器:

export default Controller.extend({
  actions: {
    saveBook(newBook,format) {
      var tmp = this.store.createRecord('book', {
        title: newBook.title,
        author: newBook.author,
        genre: newBook.genre,
        format: format,
      });
      tmp.save();
      this.transitionToRoute('books.list');
    }
  }
});

编辑控制器:

  actions: {
    saveBook(book) {
      book.save();
      this.transitionToRoute('books.list');
    }
  }

我知道我在某个地方遗漏了一些东西来将模型值传递给组件,但不知道该怎么做或它属于哪里。

如果能提供任何帮助,我将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ember.js


    【解决方案1】:

    如果有人看到这个问题正在使用 Ember Octane (3.14+)

    这就是你想要的(基于@AhmetEmre 的回答):

    模板:

    <select id="format" {{on 'change' this.updateValue}}>
      <option value=""></option>
      <option value="Paperback" selected={{eq this.value "Paperback"}} >Paperback</option>
      <option value="Hardcover" selected={{eq this.value "Hardcover"}} >Hardcover</option>
      <option value="E-Book" selected={{eq this.value "E-Book"}}>E-Book</option>
    </select>
    

    组件的JS:

    import Component from '@glimmer/component';
    import { tracked } from '@glimmer/tracking';
    import { action } from '@ember/object';
    
    export default class MyComponent extends Component {
      @tracked value = 'Hardcover';
    
      @action updateValue(event) {
        this.value = event.target.value;
      }
    }
    

    【讨论】:

      【解决方案2】:

      HTML select元素的默认值可以通过using selected argument in option tag来实现。

      所以你的模板 .hbs 会是这样的:

      <select id="format" onchange={{action 'updateValue'}}>
        <option value=""></option>
        <option value="Paperback" selected={{eq value "Paperback"}} >Paperback</option>
        <option value="Hardcover" selected={{eq value "Hardcover"}} >Hardcover</option>
        <option value="E-Book" selected={{eq value "E-Book"}}>E-Book</option>
      </select>
      

      你的 component.js 会是这样的:

      value: 'Hardcover', 
      
      actions: {
        updateValue(event){
          this.set('value', event.target.value); 
        }
      }
      

      您可以查看this twiddle 的用法示例。顺便说一句,这个例子依赖于ember-truth-helpers addon,使用了eq helper。

      【讨论】:

      • 感谢您的回复艾哈迈德。不幸的是,这根本没有任何区别。输入记录时,所选值未传递到组件。
      猜你喜欢
      • 2016-05-11
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 2021-06-22
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多