2013-02-25 4 views
2

Я хотел бы создать динамическое имя класса для объекта со значением, которое я получаю от своей модели. Один из ключей называется provider, который содержит либо «твиттер», либо «facebook». То, что я хотел бы сделать, - это добавить строку «icon-» к провайдеру, чтобы получившийся класс был icon-twitter или icon-facebook.Создание динамической строки с bindAttr

Это код, который у меня есть.

<i {{bindAttr class=":avatar-icon account.provider"}}></i>

Ember предлагает способ включить статическую строку в атрибуте, предваряя : к нему. Вы можете видеть, что я также добавляю класс, называемый avatar-icon в этом примере. Я уже пробовал :icon-account.provider, который просто привел к литеральной строке «icon-account.provider».

ОТВЕТ Ницца. Я сейчас работаю над решением, похожим на ваш ответ. Вопрос: этот взгляд будет использоваться в контексте каждого цикла. Как передать текущий элемент, который будет использоваться в представлении? У меня есть это прямо сейчас:

{{#each account in controller}} {{#view "Social.AccountButtonView"}} <i {{bindAttr class="account.provider"}}></i> {{/view}} {{/each}}

Можно просто сделать это:

{{#view "Social.AccountButtonView" account="account"}} ?

+0

Я считаю, что вам нужно будет что-то вроде '{{#view" Social.AccountButtonView "accountBinding =" account "}} ... {{view}} '. Я считаю, что «учетная запись» в этом случае будет недоступна изнутри дочернего представления, поэтому из представления вы должны ссылаться на это как «view.account» – MilkyWayJoe

ответ

2

Я ранее заявлял, что attributeBindings будет подходящим решением для этого, но я ошибся. При привязке атрибута class данного View, как указано, вы должны использовать classNames или classNameBindings. Пожалуйста, обратитесь к приведенному ниже образцу:

App.ApplicationView = Em.View.extend({ 
    provider: 'Facebook', 
    classNameBindings: 'providerClass', 
    providerClass: function() { 
     return 'icon-avatar icon-%@'.fmt(this.get('provider').toLowerCase()); 
    }.property('provider') 
}); 

Это будет оказывать следующий HTML:

<div id="ember212" class="ember-view icon-avatar icon-facebook"> 
    <h1>App</h1>  
</div> 

Вот скрипка: http://jsfiddle.net/schawaska/HH9Sk/

(Примечание: скрипка ссылки на версию Ember.js ранее RC)

+0

. Вы не должны рекламировать, используя 'attributeBindings', вы должны просто используйте 'classNameBindings'. Я боюсь, что они будут часто конфликтуют. – ebryn

+0

@ebryn вы могли бы объяснить немного больше? Честный вопрос: что вы имеете в виду, когда говорите, что они обычно конфликтуют? – MilkyWayJoe

+0

Если вы хотите обновить атрибут 'class', вы должны использовать свойства' classNames' или 'classNameBindings', выставленные в' Ember.View'. Я считаю, что использование атрибута attribute: ['class'] '- плохая идея, когда эти функции уже существуют. – ebryn

Смежные вопросы