我正在尝试编写一个处理我的应用程序中的自定义字段的通用视图,但我很难让它工作。这是场景 - 我有一个fieldDef
对象定义了自定义字段,valueObject
有一个数组customFields
,它有值。我想做的是这样的事情:
{{view Ember.TextField valueBinding="valueObject.customFields.[fieldDef.name]"}}
显然这不起作用,因为它将fieldDef.name
视为文字。我已经尝试重写TextField类,但似乎无法将其绑定。
有关如何完成此任务的任何建议?
谢谢, 斯科特
答案 0 :(得分:6)
Ember无法绑定到数组索引,因此您必须解决它。一种解决方案是将自己限制为单向绑定,其中文本字段更新值哈希值。如果您打算在用户按下按钮后提交表单,这应该可以解决问题。
在控制器中定义一个字段ID数组,并为其值输入一个哈希值。
App.ApplicationController = Ember.Controller.extend({
fieldIds: ['name', 'email', 'whatever'],
fieldValues: {} // {name: 'user', email: 'user@...', ...}
});
现在扩展Ember.TextField
以在文本字段更改时更新您的值哈希。您需要从控制器传递每个实例fieldId
和对values
哈希的引用。
App.TextField = Ember.TextField.extend({
fieldId: null,
values: null,
valueChange: function() {
var fieldId = this.get('fieldId');
var values = this.get('values');
if (values && fieldId) values[fieldId] = this.get('value');
}.observes('value')
});
模板很简单。
{{#each fieldId in fieldIds}}
<label>{{fieldId}}</label>
{{view App.TextField fieldIdBinding="fieldId" valuesBinding="fieldValues"}}
<br/>
{{/each}}
答案 1 :(得分:1)
@ahmacleod很棒的回答男人。如果有人对此感兴趣,那么它也可以很好地扩展选择:
import Ember from 'ember';
export default Ember.Select.extend({
fieldId: null,
values: null,
valueChange: function() {
var fieldId = this.get('fieldId');
var values = this.get('values');
if (values && fieldId) values[fieldId] = this.get('value');
}.observes('value')
});
将其称为普通组件(components / dynamic-select.js)
{{#each id in fieldIds}}
{{dynamic-select content=fieldIds fieldIdBinding="header"
valuesBinding="fields"}}
{{/each}}
答案 2 :(得分:0)
您现在可以在 mut 帮助器的帮助下将输入值与对象的动态键(变量)绑定。
https://guides.emberjs.com/v2.6.0/templates/input-helpers/#toc_binding-dynamic-attribute
您可以像这样访问它,
var Object = {};
var key = "firstName";
我们可以像这样绑定输入助手中的键,
{{input value=(mut (get Object key))}}
{{Object.firstName}} // Prints the dynamic value in textbox