通过模型的属性进行绑定迭代

时间:2014-01-29 22:50:48

标签: ember.js ember-data

我正在构建一个管理组件,它构建一个小表单来编辑给定模型的属性。关键是它与模型无关,我几乎就在那里(我认为),但我一直在努力使绑定正常工作。

以下是设置...模板action.hbs引用我的组件并传入modelMeta属性(更多内容在一秒内):

{{model-admin-form
    model=content
    meta=modelMeta
}}

在控制器(ActionController)中,我将modelMeta属性定义为:

modelMeta: function() {
    var vals = [];
    var attributeMap = this.get('content.constructor.attributes');
    var self = this;
    attributeMap.forEach(function(name, value) {
        item = Ember.Object.create({
            name: value.name,
            type: value.type,
            value: self.get('content.' + name)
        });
        vals.push(item);
    });
    return vals;
}.property('content'),

这给了我一个模型中所有属性的数组,每个属性给我一个“名字”,“类型”和“值”。这很有效,除了“值”没有绑定到模型。好的,没问题,我只需将作业行更改为:

valueBinding: self.get('content.' + name);

不。这不起作用。该死的。为什么不?好吧,使用Ember Inspector,我可以看到valueBinding已设置,但它的_from属性看起来很糟糕:

我原本以为它会指向像'controllers.actions.content ......'这样的东西。相反,“Alt Gained”的值是属性的实际字符串值,但不是绑定引用。

任何人都可以帮助我吗?

= - = - = - = - = - = - = - UPDATE = - = - = - = - = - = - = -

我稍微更新了一些示例,以便更加清晰并添加一些上下文。本练习的最终目标是提供一个计算属性modelMeta,它是一个数组,其中数组中的每个元素表示模型中属性的元信息。捕获的元信息是:

  • name:属性名称
  • type:变量的类型(例如,String,Number等)
  • value / valueBinding:对模型记录上的命名属性的绑定引用

前两个是小菜一碟。最后一个是棘手的部分。获得一个未绑定的值也是微不足道的,但绑定它似乎很棘手。

2 个答案:

答案 0 :(得分:1)

你可以尝试:

var record = self.get('content'); // yes?
... Object.create({
  valueBinding: 'record.' + name,
  record: record // give the binding something to bind against
});

以下是您的代码中出现的问题:

value: self.get('content.' + name)可能在填充模型实例之前过早获取属性值。如果模型属性发生变化,它肯定不会更新。

valueBinding: self.get('content.' + name)不起作用,因为它试图建立对属性的的绑定。假设name'email',则self.get('content.' + name)可能为'test@example.com',因此value现在绑定到名为'test@example.com'的属性(始终未定义) )。

答案 1 :(得分:0)

var metaObject = Ember.Object.extend({
  value: Ember.computed.alias('item.name')
  // ^ same as saying valueBinding: 'item.name'
});


// Then in your model

modelMeta: function() {
  var attributeMap = this.get('content.constructor.attributes');
  var self = this;
  return attributeMap.map(function(name, value) {
    metaObject.create({
      item: item
    })
  });
}.property('content')

不确定我是否包含了您想要的所有属性,但您可以了解上述内容。将项目传递给实例create(),并将项目绑定定义到类定义中。