angularjs에서 줄 바꿈 유지


176

나는 SO 질문 을 보았습니다 .

이전 버전 이 있기 때문에 코드 대신 ng-bind="item.desc"사용합니다 .{{item.desc}}ng-repeat

그래서 내 코드 :

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

항목 설명 \n에 줄 바꿈이 포함되어 있지 않습니다.

{{item.description}}ng-repeat내용 이 있다고 가정하면 개행을 쉽게 표시 할 수 있습니까?


<pre> 태그에 넣습니까?
aet

88
래퍼 스타일링 div과를 style="white-space:pre-wrap;".
Stewie

1
@Stewie의 의견은 저에게 완벽하게 작동합니다 (AngularJS 1.2.18). 필라 우 및 Paul Weber의 솔루션과 달리 개별 요소의 스타일을 지정하는 방법을 명시 적으로 표시하며 <pre> 태그의 스타일을 다른 스타일로 변경할 필요가 없습니다. 제안했다.
Andre Holzner

당신은 옳습니다. 모든 사람들이 기본 CSS를 사용하고 요소에 클래스를 적용하는 방법을 알고 있다고 가정했습니다. Stewie가 자신의 의견을 답변으로 올렸다면 더 좋을 것입니다. 그가 충분한 포인트를 가지고있는 것처럼 보이지만 ...
Paul Weber

@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
pre와 같이 고정 폭 글꼴로 다시 스타일을 지정하지 않으므로 IMO에서 가장 좋은 솔루션입니다.
Troels Larsen

1
보존 될 텍스트 앞의 공백을보십시오.
실버 성기사

1
당신이 그것을 가져 왔기 때문에 pre-line선호 하지 않을까요? HTML이 일반적으로 노드의 텍스트 내용을 렌더링하고 줄 바꿈을 유지하는 방식에 더 가깝습니다.
아키

흠 ... 당신은 맞습니다. 프리 라인이 더 나은 솔루션입니다. 왜 더 이상 프리 라인 대신 프리 랩을 선택하는지 모르겠습니다. 프리 라인에 대한 브라우저 지원이 좋지 않을 수도 있습니다. 그러나 나는 이것을 대답에 추가 할 것이다 ... 렌더링의 비교는 다음과 같습니다 : meyerweb.com/eric/css/tests/white-space.html
Paul Weber

이것이 정답입니다! 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편집 내용을 기반으로 해야한다고 생각 합니다.
Diolor

29
많은 경우 <pre> 태그는 텍스트를 택배로 변환하고 페이지 스타일을 깨뜨 리므로 좋은 솔루션이 아닙니다. style = "white-space : pre-wrap;" 해결책은 더 나은 해결책 인 것 같습니다 (적어도 나의 상황에서는)
CF_HoneyBadger

1
@CF_HoneyBadger 잘, 당신 @pilau의 대답은 올바른 일이지만 내 문제가있는 것은 아닙니다 때문에 난을 downvoted있어
맥심 Shoustin

나는 모든 변환 시도 \n'에 이상이야 <br/>의'를이 모든 당신의 발견 변환 한 후 다음의 과정이 태그는 HTML 마크 업 ...로 렌더링되는되지 않은 style솔루션이이 놀라운 도움과 단순화 ... 지금은하지 않습니다 모든 백엔드 데이터를 계속 변환하고 View에서 약간의 변경을 수행해야합니다 ... + 1000이 필요합니다!
twknab

이것은 코드에서는 작동하지만 예를 들어 사용자에게 메시지를 표시하는 것은 아닙니다. 나는 바울의 대답은 올바른 생각
Quintonn

63

CSS로 너무 간단합니다 (작동합니다, 맹세합니다).

.angular-with-newlines {
  white-space: pre;
}
  • 엄마 봐요! 추가 HTML 태그가 없습니다!

@pilau 공백이 아닌 쉼표 (,)가 포함 된 텍스트를 줄 바꿈하려면 어떻게해야합니까?
Shylendra Madda

@ shylendra 내 솔루션은 텍스트를 줄 바꿈하지 않으므로 마치 pre태그 에있는 것처럼 동작합니다 . 다른 질문이 있을까요? 아니면 내가 당신의 요점을 그리워?
pilau

브라우저 호환성에 대해 궁금했습니다. 이 차트에 따르면 모든 주요 브라우저에서 작동하는 것으로 보입니다. 개행을 br 태그로 바꾸는 것보다 번거롭지 않습니다. 감사! 공백을 포함하지 않도록 코드 형식에주의를 기울이면 물론 표시됩니다. developer.mozilla.org/en-US/docs/Web/CSS/white-space
Paul Weber

공백을 사용하는 것이 훨씬 좋습니다. 줄 바꿈 : 그렇지 않으면 내용이 줄 바꿈되지 않습니다.
Paul Weber

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 솔루션은 작동하지만 스타일을 실제로 제어 할 수는 없습니다. 필자의 경우 줄 바꿈 후에 약간 더 많은 공간을 원했습니다. 다음은 이것을 처리하기 위해 만든 지시문입니다 (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);

사용하다:

<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 : pre-wrap"을 사용하면 좋을 것입니다. 줄 바꿈과 공백이 실제로 특별한 오류 메시지를 처리 ​​해야하는 것과 동일한 문제가 있습니다. 방금 데이터를 바인딩하는이 인라인을 추가했으며 매력처럼 작동합니다!


0

나는 너에게 비슷한 문제가 있었다. 나는 다른 답변에 열중하지 않습니다. 왜냐하면 개행 동작을 매우 쉽게 스타일 지정할 수 없기 때문입니다. 원래 데이터를 제어 할 수 있는지 확실하지 않지만 채택 한 솔루션은 "항목"을 문자열 배열에서 배열 배열로 전환하는 것이 었습니다. 두 번째 배열의 각 항목에는 텍스트 줄이 포함됩니다 . 그렇게하면 다음과 같은 것을 할 수 있습니다 :

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

이런 식으로 단락에 클래스를 적용하고 CSS로 멋지게 스타일을 지정할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.