我正在构建一个管理组件,它构建一个小表单来编辑给定模型的属性。关键是它与模型无关,我几乎就在那里(我认为),但我一直在努力使绑定正常工作。
以下是设置...模板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
,它是一个数组,其中数组中的每个元素表示模型中属性的元信息。捕获的元信息是:
前两个是小菜一碟。最后一个是棘手的部分。获得一个未绑定的值也是微不足道的,但绑定它似乎很棘手。
答案 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()
,并将项目绑定定义到类定义中。