Conserver les sauts de ligne dans angularjs

176

J'ai vu cette question SO.

Mon code au lieu de l' ng-bind="item.desc"utilise {{item.desc}}car j'ai un ng-repeatavant.

Donc mon code:

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

La description de l'élément contient \npour les retours à la ligne qui ne sont pas rendus.

Comment {{item.description}}afficher les nouvelles lignes facilement en supposant que j'ai ce qui ng-repeatprécède?

Diolor
la source
Mettez-le dans une balise <pre>?
aet
88
En coiffant l'emballage divavec style="white-space:pre-wrap;".
Stewie
1
Le commentaire de @Stewie fonctionne parfaitement pour moi (AngularJS 1.2.18), il montre explicitement comment styliser l'élément individuel (par opposition à la solution de pilau et de Paul Weber) et pas besoin de changer les styles de la balise <pre> comme les autres proposé.
Andre Holzner
Vous avez raison, j'ai supposé que tout le monde savait utiliser le CSS de base et appliquer une classe à un élément. Si Stewie avait posté son commentaire comme réponse, cela aurait été mieux pour lui. Bien qu'il semble qu'il ait assez de points ...
Paul Weber
Je suis d'accord, @Stewie aurait certainement dû formater son commentaire comme une réponse. Cela a parfaitement résolu mon problème.
CF_HoneyBadger

Réponses:

285

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 interrompra également le contenu aux limites du contenu. Plus d'informations sur la propriété d'espace blanc peuvent être trouvées ici:

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

Si vous souhaitez interrompre les sauts de ligne, mais également réduire plusieurs espaces ou espaces blancs précédant le texte (très similaire au comportement d'origine du navigateur), vous pouvez utiliser, comme @aaki l'a suggéré:

white-space: pre-line;

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

Paul Weber
la source
1
La meilleure solution ici IMO, car elle ne se redéfinit pas vers une police mono-espacée comme pre.
Troels Larsen
1
Regardez l'espace blanc précédant le texte, qui sera conservé.
Silver Paladin
1
Puisque vous en avez parlé, ne serait-il pas celui que vous pre-linepréférez? Il est plus proche de la façon dont HTML rend habituellement le contenu du texte de ses nœuds tout en préservant les nouvelles lignes.
aaki
Hmm ... vous avez raison, la pré-ligne est la meilleure solution, après je ne sais plus pourquoi je choisis le pré-emballage au lieu de la pré-ligne. Peut-être que le support du navigateur pour la pré-ligne n'est pas aussi bon? Mais j'ajouterai ceci à la réponse ... Voici une comparaison des rendus: meyerweb.com/eric/css/tests/white-space.html
Paul Weber
Cela devrait être la réponse acceptée! pre-lineest la voie à suivre. Merci Paul!
demisx
126

Essayer:

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

Le <pre>wrapper imprimera le texte avec \ncomme texte

également si vous imprimez le json, pour une meilleure apparence, utilisez un jsonfiltre, comme:

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

Demo

Je suis d'accord avec @Paul Webercela, white-space: pre-wrap;c'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 à styliser)

Maxime Shoustin
la source
L'item.description est un texte qui contient des \nzones que je ne connais pas, pas à la fin. Je pense que j'ai besoin du prebasé sur votre modification.
Diolor
29
Souvent, une balise <pre> n'est pas une bonne solution car elle transforme le texte en courrier et casse le style de la page. Le style = "white-space: pre-wrap;" la solution semble être une meilleure solution (du moins pour ma situation)
CF_HoneyBadger
1
@CF_HoneyBadger eh bien, car @pilaula réponse de vous est la bonne, mais cela ne signifie pas que la mienne est fausse et donc j'ai été déclassé
Maxim Shoustin
J'ai essayé de convertir tout \nen <br/>'s et bien sûr, ces balises n'étaient pas rendues sous forme de balisage HTML ... après toute cette conversion a trouvé votre stylesolution et c'est une aide et une simplification incroyables ... maintenant je ne le fais pas Je dois continuer à convertir toutes mes données backend et juste faire quelques changements dans la vue ... Vous méritez +1000!
twknab
Cela fonctionne pour le code, mais pas pour afficher des messages aux utilisateurs par exemple. Je pense que la réponse de Paul est la bonne
Quintonn
63

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

.angular-with-newlines {
  white-space: pre;
}
  • Regarde ma! Pas de balises HTML supplémentaires!
pilaf
la source
@pilau Je veux envelopper le texte s'il contient une virgule (,) pas un espace blanc, comment puis-je faire cela?
Shylendra Madda
@shylendra ma solution n'enveloppe pas le texte, elle se comporte comme si elle était dans une prebalise. Peut-être ouvrir une autre question? Ou peut-être ai-je manqué votre point?
pilau
Je me posais des questions sur la compatibilité du navigateur. Selon ce graphique, il semble fonctionner dans tous les principaux navigateurs. C'est beaucoup moins compliqué que de remplacer les nouvelles lignes par des balises br. Merci! Faites juste attention à formater le code pour qu'il ne contienne aucun espace, ils apparaîtront bien sûr. developer.mozilla.org/en-US/docs/Web/CSS/white-space
Paul Weber
Il serait peut-être encore mieux d'utiliser un espace blanc: pré-emballage, sinon le contenu ne sera jamais enveloppé.
Paul Weber
16

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

Rehan
la source
2

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

Nicolas Brugneaux
la source
1

la solution css fonctionne, mais vous ne contrôlez pas vraiment 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 (dactylographié):

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, c'est envelopper chaque partie du texte dans une <p>balise. Après cela, vous pouvez le coiffer comme vous le souhaitez.

Dmitry Efimenko
la source
1

Ajoutez simplement ceci à vos styles, cela fonctionne pour moi

white-space: pre-wrap

Par ce texte, <textarea>peut être affiché comme il est là-dedans avec des espaces et des freins de ligne

HTML

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

CSS

.text-style{
    white-space: pre-wrap
}
Akitha_MJ
la source
0

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 liais les données et cela fonctionne comme Charm!

Siddhartha Thota
la source
0

J'ai eu un problème similaire à vous. Je n'aime pas trop les autres réponses ici car elles ne vous permettent pas vraiment de définir très facilement le comportement de nouvelle ligne. Je ne sais pas si vous avez le contrôle sur les données d'origine, mais la solution que j'ai adoptée a consisté à faire passer les "éléments" d'un tableau de chaînes à un tableau de tableaux, où chaque élément du deuxième tableau contenait une ligne de texte . De cette façon, vous pouvez faire quelque chose comme:

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

De cette façon, vous pouvez appliquer des classes aux paragraphes et les styliser joliment avec CSS.

Chris Rae
la source