2013-09-10 4 views
19

У меня возникла «маленькая» проблема с угловым юпитером. Мне нужно, чтобы указать, каким-то образом, если вход с DatePicker присоединять, должно показать всплывающее окно с правом нижнем левом углу входа (по умолчанию)Позиционирование Угловой пользовательский бутстрап Datepicker

enter image description here

или если я хочу его с правой нижней вместо угла ввода. Это связано с тем, что на странице, которую я создаю, мой вход действительно близок к правой стороне страницы, и когда я присоединяю datepicker, это происходит (датапикер разрезается и теперь отображается горизонтальная прокрутка):

enter image description here

, но дело в том, что мне нужна датапикер в обоих положениях (в зависимости от случая, связанного с изображениями).

Кто-то знает, как это можно исправить? Я попытался изменить атрибут left, который является встроенным в всплывающем шаблоне datepicker, но он всегда является фиксированным значением, и я полагал, что это не реальный вариант.

Благодаря

+1

Считаете ли вы использование CSS для добавления полей? Кажется, что что-то не так с вашим CSS, вероятно, потому, что вы используете фиксированный макет.Например, если ваша страница имеет абсолютную ширину в 1000 пикселей, а ваш сборщик дат имеет ширину 300 пикселей и имеет свойство 'left' на абсолютном 800px, то вы потеряете самый правый 100px. Как правило, плохая идея иметь фиксированные макеты в CSS (что, если пользователь изменяет размеры браузера, изменяет реституцию экрана, использует мобильное устройство с меньшим экраном и т. Д.?). Это выглядит как проблема CSS и ** не ** и угловая проблема. – Mawg

+0

Я разрешил эту проблему с отрицательной маржой слева в CSS, добавив класс к родительскому тегу datepicker. – stetro

ответ

3

Если вы хотите реализовать общее решение, это то, что не может быть достигнуто только за счет изменения шаблона в datepicker-popup.

Вы должны изменить updatePosition функции внутри директивы, так что scope.position.left равно что-то вроде этого:

scope.position.left += scope.position.width - $position.position(popupEl).width; 

Но опять же, вы должны быть уверены, что вы «читать» ширину popuEl после его видимо, иначе вы получите нуль. Кроме того, если вы перейдете в другой режим (выбор месяца или года), позиция не будет обновляться, хотя ширина всплывающего окна может измениться.

Я просто хочу сказать, что эта особенность не меняется ни на одну, ни две линии, и, вероятно, лучше открыть запрос для этого в https://github.com/angular-ui/bootstrap/issues?state=open. Кто-то, возможно, захочет расследовать это дальше!

+2

Hi Bekos. Спасибо за Ваш ответ. Я открыл запрос и посмотрю, хочет ли кто-нибудь проверить это. Пока я решил свою проблему, но с большим количеством изменений. Мне пришлось изменить шаблон и удалить левый атрибут из встроенного стиля. Другая вещь, которую я сделал, заключалась в инкапсуляции ввода и datepicker в Div и использовании CSS и относительного позиционирования. Я создаю стиль для выравнивания влево и вправо, и везде, где я его использовал, я устанавливаю класс CSS в соответствии с требуемым выравниванием. – abottoni

+2

Я надеюсь, что ребята из бутстрапа рассмотрят этот запрос, потому что обходной путь - это просто странный способ справиться с этим. Спасибо за вашу помощь ! – abottoni

+0

Да, я взломал свой файл angular-ui.0.7.0.tpls.js, как описано выше, и он работал довольно хорошо: –

3

Да я взломал мой угловой ui.0.7.0.tpls.js файл, как описан выше, и она работала очень хорошо:

function updatePosition() { 
    scope.position = appendToBody ? $position.offset(element) : $position.position(element); 
    scope.position.top = scope.position.top + element.prop('offsetHeight'); 

    var padding = 20; //min distance away from right side 
    var width = popupEl.outerWidth(true); 
    var widthOver = $('body').outerWidth(true) - (scope.position.left + width + padding); 

    if(widthOver < 0) { 
     scope.position.left = scope.position.left + widthOver; 
    } 
} 
+0

Спасибо за ваше решение, работает очень хорошо. Исправлено только одно: popupEl.outerWidth (true) должно быть $ (popupEl) .outerWidth (true) – Kath

+2

Urk !! Когда вы должны взломать что-то, что используется многими, то это имеет запах кода. Во-первых, вам придется повторно взломать его каждый раз, когда базовый код обновляется, во-вторых, вы помогаете себе, а не другим. Попытайтесь приблизиться к владельцам кода и попросите их изменить его, чтобы другие могли влиять на него со стороны. – Mawg

5

Это CSS решение может быть проще, чем изменения/взлома вашего углового .js файлы:

Оберните DatePicker в DIV, а затем переопределить маржинальную CSS класс .dropdown-меню в Datepicker в:

<div id="adjust-left"> 
    <your-datepicker-here/> 
<div> 

Тогда в CSS:

#adjust-left .dropdown-menu{ 
    /* Original value: margin: 2px 0 0; */ 
    margin: 2px -Xpx; /* Where X is the amount of pixles to shift it left */ 
} 
+1

Идеальное решение! Так просто. Я добавил атрибут datepicker-postion-right для datepicker. Затем css становится: 'input [datepicker-position-right] + ul {margin: 2px -Xpx;}'. Нет необходимости в дополнительном div. – fizzyh2o

+0

Хорошее решение по сравнению с другим. – vinesh

5

Теперь последний угловой пользовательский интерфейс 1,2.0 в версиях есть опция popup-placement в настройках uib-datepicker-popup.

Краткое резюме из документов.

всплывающего размещение (по умолчанию: авто внизу слева, Config: «Размещение») - Переходя в «авто», разделенном пробелом перед размещением будет включить автоматическое позиционирование, например: «авто снизу -оставил". Всплывающее окно будет попытаться позиционировать, где он подходит в ближайшем прокручиваемом предке. Принимает:

верх - всплывающее окно сверху, горизонтально с центром на входном элементе.

верхний левый - всплывающее окно сверху, левый край выровнен с элементом ввода левого края.

верхний правый - всплывающее окно сверху, правый край выровнен с входным элементом правый край.

bottom - всплывающее окно, горизонтально по центру ввода элемент.

внизу слева - всплывающее окно внизу, левый край выровненный с вводом элемент левый край.

внизу справа - всплывающее окно внизу, правый край выровненный с входным элементом правый край.

левый - всплывающее окно слева, вертикально с центром на входе элемент.

левый верх - всплывающее окно слева, верхний край выровненный с элементом ввода верхний край.

левый нижний - всплывающее окно слева, нижний край выровненный с входным элементом нижний край.

правый - всплывающее окно справа, вертикально центрированное на входном элементе.

правый верх - всплывающее окно справа, верх край выровненный с элементом ввода верхний край.

правая нижняя - всплывающее окно на справа, нижний край выровнен с нижним краем входного элемента.

В вашем случае, я думаю, bottom-right будет работать.

играть с this plunker для получения более подробной информации.

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