获取 Ember 中另一个 select 控件的值
Get the value of another select control in Ember
我的情况是我有一个 table,用户可以在其中添加供应商,并编辑任何现有供应商(因此可能有多个记录)。其中三个字段(类型、名称、版本)来自 API(后端数据库中的一个 table)返回的查找对象。
点击前'edit'
处于编辑模式
问题是,我需要这些 select 元素是 "chained"(或级联),但由于它们是从同一个对象填充的,所以它更像是 select "Type" 的离子将过滤可用于 "Name" 的选项,同样,selecting 名称将进一步限制可用于版本的选项。
但是,由于这只是一个正在编辑的记录,这些 select 位于 {{#each supplier in suppliers}}
块中以生成行,如果该记录的 isEditing
属性 为真,因此值或 selection 是每条记录的值,例如supplier.type
而不是整个控制器上的单个 属性。
我试图想出多种方法来做到这一点,但到目前为止还没有找到解决多条记录级联下拉列表的方法,因为这意味着任何一条 select 的值都取决于记录。
如果我知道如何从控制器中引用 Type 下拉列表的值,我想我可以让选项过滤起作用,但话又说回来,可以想象两条记录可以同时处于编辑模式,所以修改控制器上的任何 属性 以填充 select 也会影响其他人,这并不好。我真的很想弄清楚这一点,所以我不必弹出模式对话框来编辑记录。
您应该使用组件分别处理每一行。
假设您有这样的事情:
{{#each suppliers as |supplier|}}
// .. a lot of if's, selects and others
{{/each}}
如果您发现自己在使用 {{#each}} 助手并且传递给该助手的代码块不止一行,那么这是一个好兆头,您可能需要一个组件.
如果您创建一个名为 SupplierRow
的组件,您可以按如下方式创建:
module export Ember.Component({
editing: Ember.computed.alias('model.isEditing'),
types: Ember.computed('passedTypes', function() {
// .. return types array for that exact supplier
}),
names: Ember.computed('passedNames', 'model.type', function() {
// .. return names array for that exact supplier based on possibleNames and model.type
}),
versions: Ember.computed('passedVersions', 'model.type', 'model.name', function() {
// .. return versions array for that exact supplier based on possibleVersions and model.type and model.name
}),
actions: {
saveClicked() {
this.sendAction('save', this.get('model'));
}
}
});
该模板基本上看起来与您当前在 {{#each}}
助手中的模板相似。它会被渲染成这样:
{{#each suppliers as |supplier|}}
{{supplier-row model=supplier possibleTypes=types possibleNames=names possibleVersions=versions save="save"}}
{{/each}}
似乎您使用的是旧版本的 Ember,它允许在 {{#each}}
助手中进行上下文切换。假设您可以为每次迭代设置 itemController
并分别处理每行的 select 可用值:
{{#each suppliers itemController="supplierController"}}
// this == supplierController, this.model == supplier
{{/each}}
因此,在 supplierController
中,您可以计算每个供应商的 select 含量。您还可以通过 this.parentController
属性.
从项目控制器访问主控制器
我的情况是我有一个 table,用户可以在其中添加供应商,并编辑任何现有供应商(因此可能有多个记录)。其中三个字段(类型、名称、版本)来自 API(后端数据库中的一个 table)返回的查找对象。
点击前'edit'
处于编辑模式
问题是,我需要这些 select 元素是 "chained"(或级联),但由于它们是从同一个对象填充的,所以它更像是 select "Type" 的离子将过滤可用于 "Name" 的选项,同样,selecting 名称将进一步限制可用于版本的选项。
但是,由于这只是一个正在编辑的记录,这些 select 位于 {{#each supplier in suppliers}}
块中以生成行,如果该记录的 isEditing
属性 为真,因此值或 selection 是每条记录的值,例如supplier.type
而不是整个控制器上的单个 属性。
我试图想出多种方法来做到这一点,但到目前为止还没有找到解决多条记录级联下拉列表的方法,因为这意味着任何一条 select 的值都取决于记录。
如果我知道如何从控制器中引用 Type 下拉列表的值,我想我可以让选项过滤起作用,但话又说回来,可以想象两条记录可以同时处于编辑模式,所以修改控制器上的任何 属性 以填充 select 也会影响其他人,这并不好。我真的很想弄清楚这一点,所以我不必弹出模式对话框来编辑记录。
您应该使用组件分别处理每一行。
假设您有这样的事情:
{{#each suppliers as |supplier|}}
// .. a lot of if's, selects and others
{{/each}}
如果您发现自己在使用 {{#each}} 助手并且传递给该助手的代码块不止一行,那么这是一个好兆头,您可能需要一个组件.
如果您创建一个名为 SupplierRow
的组件,您可以按如下方式创建:
module export Ember.Component({
editing: Ember.computed.alias('model.isEditing'),
types: Ember.computed('passedTypes', function() {
// .. return types array for that exact supplier
}),
names: Ember.computed('passedNames', 'model.type', function() {
// .. return names array for that exact supplier based on possibleNames and model.type
}),
versions: Ember.computed('passedVersions', 'model.type', 'model.name', function() {
// .. return versions array for that exact supplier based on possibleVersions and model.type and model.name
}),
actions: {
saveClicked() {
this.sendAction('save', this.get('model'));
}
}
});
该模板基本上看起来与您当前在 {{#each}}
助手中的模板相似。它会被渲染成这样:
{{#each suppliers as |supplier|}}
{{supplier-row model=supplier possibleTypes=types possibleNames=names possibleVersions=versions save="save"}}
{{/each}}
似乎您使用的是旧版本的 Ember,它允许在 {{#each}}
助手中进行上下文切换。假设您可以为每次迭代设置 itemController
并分别处理每行的 select 可用值:
{{#each suppliers itemController="supplierController"}}
// this == supplierController, this.model == supplier
{{/each}}
因此,在 supplierController
中,您可以计算每个供应商的 select 含量。您还可以通过 this.parentController
属性.