Ember.js Ember TextField valueBinding具有动态属性

Ember.js Ember TextField valueBinding具有动态属性,ember.js,Ember.js,我正在尝试编写一个通用视图来处理我的应用程序中的自定义字段,但我很难让它正常工作。这是一个场景-我有一个定义自定义字段的fieldDef对象,还有一个valueObject对象,它有一个数组,customFields,它有值。我想做的是这样的: {{view Ember.TextField valueBinding="valueObject.customFields.[fieldDef.name]"}} 显然,这不起作用,因为它将fieldDef.name视为一个文本。我尝试重写TextFie

我正在尝试编写一个通用视图来处理我的应用程序中的自定义字段,但我很难让它正常工作。这是一个场景-我有一个定义自定义字段的
fieldDef
对象,还有一个
valueObject
对象,它有一个数组,
customFields
,它有值。我想做的是这样的:

{{view Ember.TextField valueBinding="valueObject.customFields.[fieldDef.name]"}}
显然,这不起作用,因为它将
fieldDef.name
视为一个文本。我尝试重写TextField类,但似乎无法将其绑定

关于如何做到这一点有什么建议吗

谢谢,
Scott

余烬无法绑定到数组索引,因此您必须解决它。一种解决方案是将自己限制为单向绑定,其中textfield更新哈希值。如果您计划在用户按下按钮后提交表单,这应该可以做到

在控制器中定义一个字段ID数组,并为其值定义一个哈希

App.ApplicationController = Ember.Controller.extend({
  fieldIds: ['name', 'email', 'whatever'],
  fieldValues: {} // {name: 'user', email: 'user@...', ...}
});
现在扩展
Ember.TextField
,在文本字段更改时更新您的值哈希。您需要从控制器向每个实例传递一个
fieldId
和对
值的引用

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}}
{{{#fieldId中的每个fieldId}
{{fieldId}}
{{view App.TextField fieldIdBinding=“fieldId”valuesBinding=“fieldValues”}

{{/每个}}

.

@Ahmaclod伟大的回答者。万一有人对它感兴趣,它也很有用:

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)


现在,您可以借助muthelper将输入值与对象的动态键(变量)绑定

你可以这样访问它

var Object = {};
var key = "firstName";
我们可以像这样在输入助手中绑定键

{{input value=(mut (get Object key))}}

{{Object.firstName}} // Prints the dynamic value in textbox

谢谢-我使用了一种非常类似的方法。如果我只想要一个附加了valueBinding的普通TextField,我是否需要在控制器中声明App.TextField=Ember.TextField.extend({})?
{{input value=(mut (get Object key))}}

{{Object.firstName}} // Prints the dynamic value in textbox