将原生 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')