2016-01-26 8 views
7

Zum Beispiel: Ember-Komponenten ermöglichen das Hinzufügen eines classNames-Arrays, und diese Klassen werden dem Hauptteil der Komponente hinzugefügt. sagen wir haben diese Komponente neu divWie mache ich dynamische Klassennamen in einer Ember 2.0-Komponente?

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

dann, wenn Sie diese Komponente überprüfen, wenn Sie sehen gemacht wird:

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

das ist in Ordnung, aber mein Problem ist, was passiert, wenn ich will Verwenden Sie diese Komponente manchmal als Flüssigkeitsbehälter und manchmal möchte ich sie zu einem Jumbotron usw. machen.

Gibt es eine Möglichkeit, dies in HTML zu tun und die component.js korrekt anwenden zu lassen?

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

dann in der component.js:

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

Werfen Sie einen Blick auf [classNameBindings] (http://emberjs.com/api/classes/Ember.Component.html#property_classNameBindings) –

+1

@Craicerjack 'classNames' ist nicht' classNameBindings' –

Antwort

8

Sie Klassennamen hinzufügen können, indem sie einfach in dem class Attribut auf Ihrer Komponente festgelegt wird:

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

haha! Vielen Dank! Ich habe viel zu viel nachgedacht! – pfg

+0

ist nicht das Attribut 'classNames' oder wurde dies kürzlich geändert? – akst

+1

@ABot Ich denke, 'class' funktioniert, seit sie in htmlbars umgezogen sind und es ist eine bessere Option, aber' classNames' funktioniert immer noch. – dmk

0

Gerade als eine Alternative könnte so etwas verwenden

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

Die @dmk'solution ist die sauberste, aber wenn Ihr Szenario ist es nicht funktioniert Sie classNameBindings verwenden können:

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

Dieser ist großartig, wenn die Komponente ihre eigenen Klassennamen steuern soll. – Skitterm

+0

dies könnte einfach 'classNameBindings: ['myClassNames'] sein,' wobei 'myClassNames' ein Attribut ist, das in der Vorlage deklariert wird.keine berechnete Eigenschaft notwendig (natürlich in Ihrem Beispiel, weil OP eine durch Kommas getrennte Liste hat). – Jason

0

Wenn jemandglut-Komponenten-CSS verwendet, können Sie die join-classes ausprobieren möchten oder das local-class Attributhelfer.

{{join-classes styles.myclass1 attributeValue}} 

attributeValue kann ein Wert aus der Controller der Komponente sein (I bedeuten component.js) oder ein Element im Innern eines each Block.

Wenn styles.myclass1 = .class1 und attributeValue = .dummy, dann würden die Wähler als .class1.dummy im styles.css zur Verfügung.

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

Wenn myvalue = 'part', dann mit diesem, würde die erzeugte Klassennamen umfassen tree-to-component_myclass-part__sdfje2jbr2 (letzter Teil erzeugt id) und würde im Stylesheet als .myclass-part zugänglich sein.

Verwandte Themen