2016-06-15 2 views
1

Итак, все должно быть component.Сделать группу кнопок из директив (компонентов)

Предположим, что я определяю некоторые компоненты кнопок для редактирования/удаления/просмотра объектов моего домена. В качестве примера:

angular.module('xxx').component('editButton', { 
    bindings: {domainObject: '<'}, 
    template: '<button class="btn btn-default" ng-click="$ctrl.displayEditForm()">Edit</button>' 
    controller: /* ... */ 
}); 

И я использую его как:

<edit-button domain-object="$ctrl.myDomainObject"></edit-button> 

Работает отлично! Однако, когда мне нужен конкретный код (например button group), я пытаюсь сделать это как:

<div class="btn-group"> 
    <edit-button domain-object="object"></edit-button> 
    <delete-button domain-object="object"></delete-button> 
</div> 

Что, конечно, не отображается правильно Bootstrap, потому что мои кнопки обернуты с определениями компонентов.

Имея в виду, что replace functionality is deprecated, интересно, как преодолеть эту проблему?

+0

Если говорить об абстрактном идеальном компоненте - он должен иметь свой собственный css. Если вы говорите о реальном мире - вам все еще нужны директивы в угловом 1.5 и там В угловом 2 вы можете сопоставлять компоненты с атрибутами html тоже не только с элементами. –

+0

Итак, вы говорите, что я смогу создать '@Component ({selector: '[my-component]'})' в Angular 2? Это решило бы проблему, действительно! Можете ли вы разместить его в качестве ответа, пожалуйста? – fracz

+0

Я только что нашел [директивы атрибутов] (https://angular.io/docs/ts/latest/guide/attribute-directives.html). Они решат проблему в угловом 2. Как и в случае с 1.5, решение заключается в использовании «замены», несмотря на его устаревание или директиву с 'ограничение: 'A''. Так просто! – fracz

ответ

1

Компонент не всегда является элементом html. Он может быть (и часто представляет собой группу элементов html)

Ваш шаблон компонента должен включать окружную группу div btn.

template: '<div class="btn-group"><button class="btn btn-default" ng-click="$ctrl.displayEditForm()">Edit</button>'...etc. 

Теперь, если вы хотите использовать кнопки по отдельности, вы можете просто переопределить стили Bootstrap, так что они не используют «>»

.your-page .btn-group .btn:first-child:not(:last-child):not(.dropdown-toggle) { 
    border-top-right-radius: 0; 
    border-bottom-right-radius: 0; 
} 

вместо

.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle) { 
     border-top-right-radius: 0; 
     border-bottom-right-radius: 0; 
} 
+0

Я хочу, чтобы у вас не было кнопок в одном компоненте, поскольку это нарушает SRP (основное преимущество от компонентов для меня). Дублирование CSS-кода из бутстрапа также является * далеко не идеальным * решением (я полагаю, что копировать и вставлять больше, чем вы предлагаете). Тем не менее, ваши идеи решают проблему * как-то *, спасибо. – fracz

+0

В компонентном приложении у вас обязательно будут компоненты, содержащие множество элементов и других дочерних компонентов. (см. пример списка героев в угловом доке). Я думаю, что вы подталкиваете теорию SRP к крайности. Здесь компонент будет иметь ответственность за управление состоянием вашего объекта. – gyc

+0

Конечно, компоненты могут создавать иерархии. Но единственной ответственностью компонента 'my-button-group' должна быть группировка других, специализированных компонентов, таких как' edit-button' и 'delete-button'. Если компоненту 'my-button-group' нужно будет позаботиться о деталях редактирования и удаления объектов, его код будет расти с добавлением каждой новой кнопки. Это, безусловно, будет плохо сконструированным компонентом. – fracz

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