2015-01-02 2 views
0

У меня есть компонент ember, ожидающий параметр как массив объектов. По умолчанию этот параметр должен быть встроенным массивом с внутренними объектами внутри. Я хотел бы преобразовать этот массив в массив ember, содержащий объекты ember.Лучшая практика для преобразования собственного массива/объекта в Ember.Array/Ember.Object

Я думал о чем-то в этом роде, но это создаст бесконечный цикл стрельбы наблюдателя каждый раз:

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'), 
}); 

Что является лучшей практикой, чтобы сделать это?

Благодаря

ответ

1

Вы можете просто изменить начальные параметры, когда первый компонент загружается на 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

+0

Это не будет работать, если содержимое изменится. – Asgaroth

1

Если причина, почему вы должны объекты внутри вашей компонент, потому что вы делаете 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') 
Смежные вопросы