Збережіть розриви рядків у кутах


176

Я бачив це питання ТАК

Мій код замість ng-bind="item.desc"використання, {{item.desc}}тому що я мав ng-repeatраніше.

Тож мій код:

<div ng-repeat="item in items">
  {{item.description}}
</div>

Опис елемента містить \nнові рядки, які не відображаються.

Як легко {{item.description}}відображати нові рядки, вважаючи, що я маю ng-repeatвищезазначене?


Помістити його в тег <pre>?
ает

88
Шляхом стилізації обгортки divс style="white-space:pre-wrap;".
Стюі

1
Коментар @Stewie для мене прекрасно працює (AngularJS 1.2.18), він чітко показує, як стилізувати окремий елемент (на відміну від рішення пілау та рішення Пола Вебера) і не потрібно змінювати стилі тегу <pre> як інші запропоновано.
Андре Хольцнер

Ви маєте рацію, я припустив, що всі знають, як використовувати базовий css та застосувати клас до елемента. Якби Стюі опублікувала свій коментар як відповідь, було б краще для нього. Хоча здається, ніби він має достатньо очок ...
Пол Вебер

Я згоден, @Stewie напевно повинен був сформулювати його коментар як відповідь. Це вирішило моє питання ідеально.
CF_HoneyBadger

Відповіді:


285

На основі відповіді @pilau - але з покращенням, яке навіть прийнятої відповіді не має.

<div class="angular-with-newlines" ng-repeat="item in items">
   {{item.description}}
</div>

/* in the css file or in a style block */
.angular-with-newlines {
    white-space: pre-wrap;
}

Це використовує нові рядки та пробіли, як задано, але також порушує вміст на межі вмісту. Більше інформації про властивість білого простору можна знайти тут:

https://developer.mozilla.org/en-US/docs/Web/CSS/white-space

Якщо ви хочете перейти на нові рядки, але також згорнути кілька пробілів або пробіл перед текстом (дуже подібний до оригінальної поведінки браузера), ви можете використовувати, як @aaki запропонував:

white-space: pre-line;

Приємне порівняння різних режимів візуалізації: http://meyerweb.com/eric/css/tests/white-space.html


1
Найкраще рішення тут IMO, оскільки воно не рестайлінг до монорозміщеного шрифту, як попередній.
Тролі Ларсена

1
Подивіться пробіл перед текстом, який буде збережений.
Срібний Паладін

1
Оскільки ви його виховували, не було б pre-lineкращим? Це ближче до того, як HTML зазвичай надає текстовий вміст своїх вузлів і все ще зберігає нові рядки.
аакі

Хм ... ви праві, попередня лінія - це краще рішення, після того як я вже не впевнений, чому я вибираю попереднє обгортання замість попереднього рядка. Можливо, підтримка браузера попередньої лінії не настільки хороша? Але я додам це до відповіді ... Ось порівняння візуалізації: meyerweb.com/eric/css/tests/white-space.html
Пол Вебер

Це має бути прийнята відповідь! pre-lineце шлях. Спасибі Павло!
demisx

126

Спробуйте:

<div ng-repeat="item in items">
  <pre>{{item.description}}</pre>
</div>

<pre>Обгортка буде друкувати текст з в \nвигляді тексту

також якщо ви надрукуєте json, для кращого вигляду використовуйте jsonфільтр, наприклад:

<div ng-repeat="item in items">
  <pre>{{item.description|json}}</pre>
</div>

Demo

Я погоджуюся з тим, @Paul Weberщо white-space: pre-wrap;краще використовувати підхід, у будь-якому випадку <pre>- швидкий спосіб в основному для налагодження деяких речей (якщо ви не хочете витрачати час на стилізацію)


Опис item.description - це текст, який має \nмісця, які я не знаю, не в кінці. Я думаю, що мені потрібно на preоснові вашої редакції.
Діолор

29
Багато разів тег <pre> не є хорошим рішенням, оскільки він перетворює текст в кур'єрський розрив і порушує стиль сторінки. Стиль = "white-space: попереднє обгортання;" рішення здається кращим рішенням (принаймні для моєї ситуації)
CF_HoneyBadger

1
@CF_HoneyBadger добре, для вас @pilauвідповідь правильна, але це не означає, що моя помиляється, і тому я зняв з себе відповідальність
Максим Шустін

Я спробував перетворити все \n, що закінчилося, на <br/>'s, а потім, звичайно, ці теги не надавались як розмітка HTML ... зрештою, це конвертування знайшло ваше styleрішення, і це неймовірна допомога та спрощення ... тепер я не доведеться продовжувати конвертувати всі мої резервні дані та просто внести кілька змін у Перегляд ... Ви заслуговуєте +1000!
twknab

Це працює для коду, але не для показу повідомлень користувачам, наприклад. Я думаю, що відповідь Поля правильна
Кінтонн

63

З CSS це так просто (це працює, клянусь).

.angular-with-newlines {
  white-space: pre;
}
  • Подивися ма! Без додаткових тегів HTML!

@pilau Я хочу обернути текст, якщо він містить коми (,), а не пробіл, як це зробити?
Шилендра Мадда

@shylendra моє рішення не містить тексту, він змушує себе поводитись так, ніби в preтегу. Можливо, відкрити ще одне питання? А може, я пропустив вашу думку?
pilau

Мені було цікаво про сумісність браузера. Відповідно до цієї діаграми, здається, вона працює у всіх основних браузерах. Це набагато менше клопоту, ніж заміна нових рядків тегами br. Дякую! Просто зверніть увагу на формат коду, щоб він не містив пробілів, вони, звичайно, відображатимуться. developer.mozilla.org/en-US/docs/Web/CSS/white-space
Пол Вебер

Можливо, ще краще використовувати пробіл: попередньо обгорніть, інакше вміст ніколи не перегорне.
Пол Вебер

16

За допомогою CSS цього можна легко досягти.

<div ng-repeat="item in items">
<span style="white-space:pre-wrap;"> {{item.description}}</span>
</div>  

Або для цього можна створити клас CSS і використовувати його із зовнішнього файлу CSS


2

Ну, це залежить, якщо ви хочете прив'язувати дані, не повинно бути форматування в ньому, інакше ви можете bind-htmlі description.replace(/\\n/g, '<br>') не впевнені, що це все, що ви хочете.


1

рішення css працює, однак ви не дуже контролюєте стилізацію. У моєму випадку я хотів трохи більше місця після розриву лінії. Ось директива, яку я створив для обробки цього (машинопис):

function preDirective(): angular.IDirective {
    return {
        restrict: 'C',
        priority: 450,
        link: (scope, el, attr, ctrl) => {
            scope.$watch(
                () => el[0].innerHTML,
                (newVal) => {
                    let lineBreakIndex = newVal.indexOf('\n');
                    if (lineBreakIndex > -1 && lineBreakIndex !== newVal.length - 1 && newVal.substr(lineBreakIndex + 1, 4) != '</p>') {
                        let newHtml = `<p>${replaceAll(el[0].innerHTML, '\n\n', '\n').split('\n').join('</p><p>')}</p>`;
                        el[0].innerHTML = newHtml;
                    }
                }
            )
        }
    };

    function replaceAll(str, find, replace) {
        return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
    }

    function escapeRegExp(str) {
        return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
    }
}

angular.module('app').directive('pre', preDirective);

Використання:

<div class="pre">{{item.description}}</div>

Все, що вона робить, це загортати кожну частину тексту в <p>тег. Після цього ви можете стилізувати його як завгодно.


1

Просто додайте це до своїх стилів, це працює для мене

white-space: pre-wrap

Цей текст <textarea>можна відобразити так, як він знаходиться там із пробілами та лінійними гальмами

HTML

   <p class="text-style">{{product?.description}}</p>

CSS

.text-style{
    white-space: pre-wrap
}


0

Просто використовуйте стиль css "white-space: попередньо оберніть", і ви повинні бути гарними. У мене був той самий випуск, де мені потрібно обробляти повідомлення про помилки, для яких розриви рядків та пробіли справді є особливими. Я щойно додав цей рядок, де я прив'язував дані, і він працює як Чарівність!


0

У мене була схожа проблема з вами. Я не так захоплююсь іншими відповідями тут, тому що вони насправді не дозволяють вам легко стилізувати поведінку нового рядка. Я не впевнений, чи маєте ви контроль над вихідними даними, але прийняте нами рішення було переключити "елементи" з масиву рядків на масив масивів, де кожен елемент у другому масиві містив рядок тексту . Таким чином ви можете зробити щось на кшталт:

<div ng-repeat="item in items">
  <p ng-repeat="para in item.description">
     {{para}}
  </p>
</div>

Таким чином, ви можете застосувати класи до абзаців і красиво стилювати їх за допомогою CSS.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.