Как сделать динамические имена классов в компоненте ember 2.0?

например: Компоненты Ember позволяют добавлять массив имен классов, и эти классы будут добавлены в основной div компонента. скажем, у нас есть этот компонент под названием new-div

export default Ember.Component.extend({
    classNames: ['container']
});

затем, если вы проверите этот компонент при визуализации, вы увидите:

<div id="ember595" class="ember-view container">
...
<div>

это нормально, но моя проблема в том, что, если я хочу использовать этот компонент в качестве контейнера для жидкости иногда, и иногда я могу захотеть сделать его jumbotron и т. д.

там способ сделать это в html и иметь компонент.js применить его правильно?

{{new-div extra-classes='class1,class2'}}

затем в компоненте.js:

export default Ember.Component.extend({
    classNames: [this.get('class-names')]
});

4 ответов


Вы можете добавлять имена классов, просто указав их внутри class атрибут вашего компонента:

{{new-div class="class1 class2"}}

на @ДМК'solution - это самое чистое, но если ваш сценарий не работает, вы можете использовать classNameBindings:

export default Ember.Component.extend({
  classNameBindings: ['getClassNames'],
  getClassNames: Ember.computed('extra-classes', function(){
    return this.get('extra-classes').replace(',', ' ');
  })
})

просто в качестве альтернативы можно использовать что-то вроде этого

export default Ember.Component.extend({
attributeBindings:  ['style'],

    style: function(){
        return new Ember.Handlebars.SafeString('class="foo bar"');
    }.property(),
});

// NOT sure on this one untested
export default Ember.Component.extend({
attributeBindings:  ['classNames'],

    classNames: function(){
        return 'foo bar';
    }.property(),
});

если кто-то использует ember-component-css, вы можете попробовать join-classes или local-class вспомогательный атрибут.

{{join-classes styles.myclass1 attributeValue}}

attributeValue может быть значением из контроллера компонента (я имею в виду component.js), или элемент внутри each блок.

если styles.myclass1 = .class1 и attributeValue = .dummy, тогда селекторы будут доступны как .class1.dummy на стили.в CSS.

local-class={{(concat "myclass-" myvalue)}}

если myvalue = 'part', то с этим, сгенерированное имя класса будет включать tree-to-component_myclass-part__sdfje2jbr2 (последняя часть генерируется id) и будет доступна в таблице стилей как .myclass-part.