将原生 array/object 转换为 Ember.Array/Ember.Object 的最佳实践
Best practise to transform native array/object into Ember.Array/Ember.Object
我有一个 ember 组件需要一个对象数组形式的参数。
默认情况下,此参数将是一个包含本地对象的本地数组。
我想将此数组转换为包含 ember 个对象的 ember 数组。
我正在考虑类似的事情,但这将创建一个无限循环,每次都会触发观察者:
export default Ember.Component.extend({
content: null,
contentDidChange: function () {
var content = Ember.A();
this.get('content').forEach(function (item) {
content.addObject((item.constructor.toString() !== 'Ember.Object') ? Ember.Object.create(item) : item);
});
this.set('content', content);
}.observes('content'),
});
这样做的最佳做法是什么?
谢谢
您可以在 didInsertElement
上首次启动组件时修改初始参数,如下所示:
App.ArrContentComponent = Ember.Component.extend({
content: null,
modifyContent: function(){
var content = this.get('content').map(function(item){
return Ember.Object.create({ name: item });
});
this.set('content', content);
}.on('didInsertElement')
});
工作示例here
如果您在组件中需要对象的原因是因为您正在做 this.get(..
那么您可以改用 Ember.get(..
来绕过。
如果不是这种情况,那么我会建议将您的组件绑定到转换后的 属性,而不是原始的 content
。
transformedContent: null,
makeItem: function(item) {
return Ember.Object.create(item);
}),
cloneItems: function() {
this.set('transformedContent', this.get('content').map(this.makeItem));
}.observes('content'),
如果您想要最佳实践,那么我会创建一个 computed array ,它会在项目来来去去时对其进行转换,您将能够重新使用它们.
transformedContent: App.computed.objectArray('content')
我有一个 ember 组件需要一个对象数组形式的参数。 默认情况下,此参数将是一个包含本地对象的本地数组。 我想将此数组转换为包含 ember 个对象的 ember 数组。
我正在考虑类似的事情,但这将创建一个无限循环,每次都会触发观察者:
export default Ember.Component.extend({
content: null,
contentDidChange: function () {
var content = Ember.A();
this.get('content').forEach(function (item) {
content.addObject((item.constructor.toString() !== 'Ember.Object') ? Ember.Object.create(item) : item);
});
this.set('content', content);
}.observes('content'),
});
这样做的最佳做法是什么?
谢谢
您可以在 didInsertElement
上首次启动组件时修改初始参数,如下所示:
App.ArrContentComponent = Ember.Component.extend({
content: null,
modifyContent: function(){
var content = this.get('content').map(function(item){
return Ember.Object.create({ name: item });
});
this.set('content', content);
}.on('didInsertElement')
});
工作示例here
如果您在组件中需要对象的原因是因为您正在做 this.get(..
那么您可以改用 Ember.get(..
来绕过。
如果不是这种情况,那么我会建议将您的组件绑定到转换后的 属性,而不是原始的 content
。
transformedContent: null,
makeItem: function(item) {
return Ember.Object.create(item);
}),
cloneItems: function() {
this.set('transformedContent', this.get('content').map(this.makeItem));
}.observes('content'),
如果您想要最佳实践,那么我会创建一个 computed array ,它会在项目来来去去时对其进行转换,您将能够重新使用它们.
transformedContent: App.computed.objectArray('content')