2015-04-28 2 views
1

Я хотел бы знать, если это возможно, чтобы иметь следующийусловно завернуть директиву с другой, на основе атрибута области видимости

<my-directive wrap=true></my-directive> 
<h5>A header </h5> 
<p>lorem ipsum text</p> 

генерировать что-то вроде этого, когда обертка установлена ​​истина:

<conditional-wrapper> 
    <my-directive></my-directive> 
    <h5>A header </h5> 
    <p>lorem ipsum text</p> 
<conditional-wrapper> 

Edit: Обратите внимание, что если атрибут обертки установлен верно, я хочу <conditional-wrapper> директиву, чтобы обернуть все, что есть в моем шаблоне, а не только <my-directive>

ответ

4

вы можете достичь, обеспечивая функцию компиляции, например, так:

app.directive('myDirective', function() { 
    return { 
    restrict : 'E', 

    compile : function (tElement, tAttrs) { 
     var parent = tElement.parent(); 

     if (tAttrs.wrap && !/^conditional-wrapper$/i.test(parent[0].nodeName)) { 
     var html = tElement.parent().html(); 

     var wrapper = angular.element('<conditional-wrapper>'); 
     parent.empty().append(wrapper); 
     wrapper.html(html); 
     } 

     return function link() {} 
    } 
    } 
}) 

чек РОС here и дайте мне знать, если это то, что вы после этого.

+0

, если вы хотите обернуть ТОЛЬКО директиву И это следующие братья и сестры, вам нужно немного изменить сценарий, но это все еще довольно легко сделать. –

+0

В идеале я хотел бы, чтобы <условный-обертёр> обертывал все элементы html на шаблоне (или теле в этом plunkr) http : //plnkr.co/edit/6kdf44NowhKpjd4qbeX0? p = preview (другой элемент списка, пробелы, h5, p и т. д. все должны быть в пределах синей границы) – IgnorantUser

+0

затем модифицируйте функцию, чтобы она не ссылалась на 'tElement .parent() ', но' document.body' или так :-) –

0

Использование ng-if

<div ng-if="wrap"> 
    <conditional-wrapper> 
    <my-directive></my-directive> 
    <h5>A header </h5> 
    <p>lorem ipsum text</p> 
    <conditional-wrapper> 
</div> 
<div ng-if="!wrap"> 
    <my-directive></my-directive> 
    <h5>A header </h5> 
    <p>lorem ipsum text</p> 
</div> 

Вы можете обернуть

<my-directive></my-directive> 
<h5>A header </h5> 
<p>lorem ipsum text</p> 

в директиве, чтобы сделать свой HTML очистителя.

+0

Я попытался упростить свою проблему, поэтому забыл упомянуть что-то важное. Там будут элементы sibling , и в случае, если атрибут wrap установлен в true, их нужно будет перевести в директиву <условный-обертку> ... Это немного сложнее, чем ng-if , но спасибо! – IgnorantUser

+0

@IgnorantUser Я не понимаю, что вы там говорите. Можете ли вы, пожалуйста, обновить свой вопрос с полной информацией и примерами. –

+0

Я отредактировал исходное описание. Надеюсь, теперь это имеет больше смысла? – IgnorantUser

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