J'ai vu cette SO question.
Mon code au lieu de ng-bind="item.desc"
utilise {{item.desc}}
parce que j'ai un ng-repeat
auparavant.
Donc mon code:
<div ng-repeat="item in items">
{{item.description}}
</div>
La description de l'article contient \n
pour les nouvelles lignes qui ne sont pas rendues.
Comment le {{item.description}}
peut-il afficher facilement les nouvelles lignes en supposant que j'ai le ng-repeat
ci-dessus?
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 cassera également 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 souhaitez interrompre les sauts à la ligne, mais aussi réduire plusieurs espaces ou espaces blancs précédant le texte (très similaire au 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
Essayer:
<div ng-repeat="item in items">
<pre>{{item.description}}</pre>
</div>
Le wrapper <pre>
imprimera du texte avec \n
comme texte
également si vous imprimez le JSON, pour un meilleur rendu, utilisez le filtre json
, comme ceci:
<div ng-repeat="item in items">
<pre>{{item.description|json}}</pre>
</div>
Je suis d'accord avec @Paul Weber
pour dire que white-space: pre-wrap;
est une meilleure approche, en tout état de cause, utilisez <pre>
- le moyen rapide principalement pour déboguer des choses (si vous ne voulez pas perdre de temps en style).
C'est tellement simple avec CSS (ça marche, je le jure).
.angular-with-newlines {
white-space: pre;
}
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
Cela dépend, si vous voulez lier des données, il ne devrait y avoir aucune mise en forme, sinon vous pouvez bind-html
et faire description.replace(/\\n/g, '<br>')
Ne savez pas si c'est ce que vous voulez.
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 (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 d’envelopper chaque partie du texte dans une balise <p>
.
Utilisez simplement le style css "white-space: pre-wrap" et vous devriez être prêt à partir. J'ai le même problème où je dois gérer des messages d'erreur pour lesquels les sauts de ligne et les espaces sont vraiment particuliers. Je viens d'ajouter cette ligne où je liais les données et cela fonctionne comme un charme!
Oui, je voudrais utiliser la balise <pre>
ou ng-bind-html-unsafe
http://docs-angularjs-org-dev.appspot.com/api/ng.directive:ngBindHtmlUnsafe (utilisez ng-bind-html si 1.2+) après avoir utilisé .replace()
pour remplacer /n
en <br />
J'ai eu un problème similaire à vous. Je ne suis pas très intéressé par les autres réponses ici, car elles ne vous permettent pas vraiment de dénommer le comportement de nouvelle ligne très facilement. Je ne sais pas si vous avez le contrôle sur les données d'origine, mais la solution que j'ai adoptée consistait à faire passer les "éléments" d'un tableau de chaînes à un tableau de tableaux, chaque élément du deuxième tableau contenant 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 styler joliment avec CSS.
Ajoutez simplement ceci à vos styles, cela fonctionne pour moi
white-space: pre-wrap
Par ce texte dans <textarea>
peut être affiché car il est là avec des espaces et des freins de ligne
HTML
<p class="text-style">{{product?.description}}</p>
CSS
.text-style{
white-space: pre-wrap
}