2016-01-26 12 views
7

Ví dụ: Thành phần Ember cho phép bạn thêm mảng classNames và các lớp đó sẽ được thêm vào div chính của thành phần. nói, chúng tôi đã thành phần này được gọi là mới divLàm cách nào để tạo các lớp học động trong một thành phần ember 2.0?

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

sau đó nếu bạn kiểm tra thành phần này khi trả lại bạn sẽ thấy:

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

này là tốt nhưng vấn đề của tôi là những gì nếu tôi muốn sử dụng thành phần này như là một thùng chứa chất lỏng đôi khi và đôi khi tôi có thể muốn làm cho nó một jumbotron vv.

Có cách nào để làm điều này trong html và có component.js áp dụng nó một cách chính xác?

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

sau đó trong component.js:

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

Hãy xem [classNameBindings] (http://emberjs.com/api/classes/Ember.Component.html#property_classNameBindings) –

+1

@Craicerjack 'classNames' không phải là' classNameBindings' –

Trả lời

8

Bạn có thể thêm tên lớp chỉ đơn giản bằng cách xác định chúng bên trong thuộc tính class trên thành phần của bạn:

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

haha! Cảm ơn! Tôi đã suy nghĩ quá nhiều về điều này! – pfg

+0

không phải là thuộc tính 'classNames' hoặc thay đổi này gần đây? – akst

+1

@ABot Tôi nghĩ rằng 'class' hoạt động kể từ khi họ chuyển sang htmlbars và nó là một lựa chọn tốt hơn, nhưng' classNames' vẫn hoạt động quá. – dmk

0

Cũng như là một thay thế có thể sử dụng một cái gì đó như thế này

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

Các @dmk'solution là sạch nhất một, nhưng nếu kịch bản của bạn nó không làm việc bạn có thể sử dụng classNameBindings:

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

Điều này thật tuyệt vời khi bạn muốn thành phần kiểm soát tên lớp của chính nó. – Skitterm

+0

điều này chỉ có thể là 'classNameBindings: ['myClassNames'],' where 'myClassNames' là một thuộc tính được khai báo trên mẫu.không có thuộc tính được tính toán cần thiết (tất nhiên trong ví dụ của bạn là vì OP có một danh sách được phân tách bằng dấu phẩy). – Jason

0

Nếu ai đó đang sử dụng ember-phần-css, bạn có thể muốn thử ra các join-classes hoặc trình trợ giúp thuộc tính local-class.

{{join-classes styles.myclass1 attributeValue}} 

attributeValue có thể là một giá trị từ bộ điều khiển của thành phần (Ý tôi là component.js), hoặc một mục bên trong một khối each.

Nếu styles.myclass1 = .class1, và attributeValue = .dummy, sau đó các selectors sẽ có sẵn như .class1.dummy trong styles.css.

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

Nếu myvalue = 'part', sau đó với điều này, các classname tạo sẽ bao gồm tree-to-component_myclass-part__sdfje2jbr2 (phần cuối cùng được tạo ra id), và sẽ có thể truy cập trong stylesheet như .myclass-part.

Các vấn đề liên quan