Préserver les sauts de ligne dans angularjs

J'ai vu ce DONC, la question.

Mon code au lieu de ng-bind="item.desc" utilise {{item.desc}} parce que j'ai un ng-repeat avant.

Donc mon code:

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

La description de l'élément contient n pour les nouvelles lignes qui ne sont pas rendues.

Comment le {{item.description}} peut-il Afficher les nouvelles lignes facilement en supposant que j'ai le ng-repeat ci-dessus?

142
demandé sur Community 2013-10-30 18:13:44

8 réponses

Basé sur la réponse de @pilau-mais avec une amélioration que même la réponse acceptée n'a pas.

<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;
}

Cela utilisera les nouvelles lignes et les espaces comme indiqué, mais aussi briser le contenu aux limites du contenu. Plus d'informations sur la propriété white-space peuvent être trouvées ici:

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

Si vous voulez casser sur les nouvelles lignes, mais aussi réduire plusieurs espaces ou espaces blancs précédant le texte (très similaire à le comportement du navigateur d'origine), vous pouvez utiliser, comme @ aaki l'a suggéré:

white-space: pre-line;

Belle comparaison des différents modes de rendu: http://meyerweb.com/eric/css/tests/white-space.html

212
répondu Paul Weber 2015-02-05 10:17:06

Essayez:

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

Le <pre> wrapper imprimer le texte avec \n texte

Aussi, si vous imprimez le json, pour le meilleur look utiliser json filtre, comme:

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

Démo

Je suis d'accord avec @Paul Weber que white-space: pre-wrap; est une meilleure approche, de toute façon en utilisant <pre> - le moyen rapide principalement pour déboguer certaines choses (si vous ne voulez pas perdre de temps sur le style)

124
répondu Maxim Shoustin 2016-06-24 17:07:36

C'est si simple avec CSS (ça marche, je le jure).

.angular-with-newlines {
  white-space: pre;
}
  • Regardez ma! Pas de balises HTML supplémentaires!
57
répondu pilau 2018-03-01 13:37:20

Avec CSS, cela peut être réalisé facilement.

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

Ou une classe CSS peut être créée à cet effet et peut être utilisée à partir d'un fichier CSS externe

16
répondu Rehan 2017-10-23 08:42:00

Eh bien, cela dépend, si vous voulez lier des données, il ne devrait pas y avoir de formatage, sinon vous pouvez bind-html et faire description.replace(/\\n/g, '<br>') pas sûr que ce soit ce que vous voulez cependant.

1
répondu Nicolas Brugneaux 2013-10-30 14:19:35

La solution css fonctionne, mais vous n'avez pas vraiment le contrôle sur le style. Dans mon cas, je voulais un peu plus d'espace après le saut de ligne. Voici une directive que j'ai créée pour gérer cela (typescript):

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);

Utilisation:

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

Tout ce qu'il fait est encapsule chaque partie du texte dans un <p> balise. Après cela, vous pouvez le styliser comme vous le souhaitez.

1
répondu Dmitry 2016-04-26 19:41:36

Oui, je voudrais soit utiliser la balise <pre> ou utiliser ng-bind-html-unsafe http://docs-angularjs-org-dev.appspot.com/api/ng.directive:ngBindHtmlUnsafe (utilisez ng-bind-html si vous utilisez 1.2+) après avoir utilisé .replace() pour changer /n en <br />

0
répondu NicolasMoise 2013-10-30 14:29:19

Utilisez simplement le style css "white-space: pre-wrap" et vous devriez être prêt à partir. J'ai eu le même problème où je dois gérer les messages d'erreur pour lesquels les sauts de ligne et les espaces blancs sont vraiment particuliers. Je viens d'ajouter cette ligne où je reliais les données et cela fonctionne comme un charme!

0
répondu Siddhartha Thota 2017-11-14 20:39:44