2015-11-19 4 views
0

У меня есть настраиваемая угловая директива, которую я условно показываю, так как она находится внутри ng-if. Внутри моей пользовательской директивы я отображаю элементы html, один из которых имеет абсолютное позиционирование.угловая пользовательская директива внутри ngif - установка его абсолютной ширины сына

Я хотел бы установить ширину абсолютного элемента как ширину корня указателя. Обратите внимание: я не могу установить отображение корневого каталога директивы относительно.

Как бы вы посоветовали мне достичь такого подвига?

UPDATE: Вот jsfiddle - http://jsbin.com/qofolahani/edit?html,css,js,console,output

обратите внимание, что в функции связи я еще не CSS стиль элемента еще и, таким образом, ширина равна 0, что означает, что я не могу установить его в ширине дочернего div.

+0

'Я не могу установить отображение корневого каталога директивы относительно.' Почему? –

+0

Потому что, если директива находится внутри короткого контейнера сама по себе, я бы хотел, чтобы абсолютный элемент был настолько высок, насколько ему нужно, не создавая полосы прокрутки в dom – vondip

+3

Сделайте скрипку, неясно, что вы хотите .. –

ответ

1

Ваш вопрос вы используете restrict: E.
Браузер не связывает метод getCalculatedStyle с нестандартными объектами DOM.

Изменить эту директиву приписывать помощью:

<div my-dir></div> 

И директива:

{ 
    restrict: 'A', 
    link : function (scope, element) { 
     element.addClass('my-dir'); 
     element.find('.my-dir-content').width(element.width()); 
    }, 
    template: '<div class="my-dir-content"></div>' 
} 

Или вы должны использовать только внутренние шаблонные дивы.
replace: false может помочь в этом.

{ 
    restrict: 'E', 
    link : function (scope, element) { 
    var o = element.find('.my-dir'); 
    var i = o.find('.my-dir-content'); 
    i.width(o.width()); 
    }, 
    replace: false, 
    template: '<div class="my-dir"><div class="my-dir-content"></div>/div>' 
} 

Или иначе, заменить родительский узел:

{ 
    restrict: 'E', 
    link : function (scope, element) { 
    var i = element.find('.my-dir-content'); 
    i.width(element.width()); 
    }, 
    replace: true, 
    template: '<div class="my-dir"><div class="my-dir-content"></div>/div>' 
} 

JSBin Preview


Бонус:
Вам нужен код, как это, чтобы обновить ширину на Wi ndow изменить размер:

$(window).on('resize', onResize); 
    function onResize() { 
    i.width(o.width()); 
    } 
    scope.$on('$destroy', function(){ 
    $(window).off('resize', onResize); 
    }); 
+0

Я вижу, но моя настоящая директива сложнее этого. Это должен быть элемент. Можете ли вы придумать какой-нибудь другой способ обхода? – vondip

+0

Вы должны использовать внутренний контейнер div, а затем: см. Edit –

+0

, но что, если у меня есть несколько уровней иерархии внутри моей директивы, абсолютный сын не является сыном, а скорее потомком. – vondip

0

Вы должны добавить стиль CSS к корню директивы и установить эту позицию relative, что-то вроде

custom-directive { 
    position: relative; 
} 

Установка корневого элемента HTML на позиции: относительная позволит внутренние элементы HTML, чтобы занять позицию абсолютного в отношении директивы.

Тогда вы можете взять внутренний HTML элемент и установить

inner-html-element { 
    position: absolute; 
    width: 100%; 
} 
+0

Я не могу использовать относительное позиционирование, хотя – vondip