Bra*_*ers 1 ruby-on-rails ember.js
我正在尝试使用 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>
Run Code Online (Sandbox Code Playgroud)
模板代码(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;
},
}
});
Run Code Online (Sandbox Code Playgroud)
新建和编辑模板:
{{book-form onSave=(action 'saveBook') model=model}}
Run Code Online (Sandbox Code Playgroud)
新控制器:
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');
}
}
});
Run Code Online (Sandbox Code Playgroud)
编辑控制器:
actions: {
saveBook(book) {
book.save();
this.transitionToRoute('books.list');
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我在某个地方遗漏了一些东西来将模型值传递给组件,但我不确定如何去做或它属于哪里。
我将不胜感激。
如果有人看到这个问题正在使用 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>
Run Code Online (Sandbox Code Playgroud)
组件的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;
}
}
Run Code Online (Sandbox Code Playgroud)