รักษาตัวแบ่งบรรทัดในเชิงมุม


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) มันแสดงให้เห็นอย่างชัดเจนถึงวิธีการจัดองค์ประกอบแต่ละองค์ประกอบ (ตรงข้ามกับโซลูชันของ Pilau และ Paul Weber) และไม่จำเป็นต้องเปลี่ยนรูปแบบของแท็ก <pre> เหมือนคนอื่น เสนอ
Andre Holzner

คุณพูดถูกฉันคิดว่าทุกคนรู้วิธีการใช้ CSS ขั้นพื้นฐานและนำคลาสไปใช้กับองค์ประกอบ ถ้า Stewie โพสต์ความคิดเห็นของเขาเป็นคำตอบคงดีกว่าสำหรับเขา แม้ว่าดูเหมือนว่าเขาจะมีคะแนนมากพอ ...
พอลเวเบอร์

ฉันเห็นด้วย @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 เนื่องจากไม่ได้ จำกัด ตัวอักษรแบบเว้นวรรคแบบเดียว
Troels Larsen

1
ดูช่องว่างข้างหน้าข้อความที่จะถูกเก็บไว้
Silver Paladin

1
เมื่อคุณนำมันมาจะไม่เป็นpre-lineที่ต้องการหรือไม่ มันใกล้เคียงกับวิธีที่ HTML มักจะแสดงเนื้อหาข้อความของโหนดและยังคงรักษาบรรทัดใหม่
aaki

อืม ... คุณพูดถูก pre-line เป็นทางออกที่ดีกว่าหลังจากที่ฉันไม่แน่ใจอีกต่อไปว่าทำไมฉันถึงเลือก pre-wrap แทน pre-line บางทีเบราว์เซอร์รองรับ pre-line อาจไม่ดีใช่ไหม แต่ฉันจะเพิ่มคำตอบนี้ ... นี่คือการเปรียบเทียบเรนเดอร์: 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ตัวกรองการใช้ look look เช่น:

<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> ไม่ใช่วิธีแก้ปัญหาที่ดีเนื่องจากมันจะแปลงข้อความเป็นผู้ส่งเอกสารและแบ่งสไตล์ของหน้าเว็บออก The style = "white-space: pre-wrap;" การแก้ปัญหาน่าจะเป็นทางออกที่ดีกว่า (อย่างน้อยสำหรับสถานการณ์ของฉัน)
CF_HoneyBadger

1
@CF_HoneyBadger ได้ดีเพราะ@pilauคำตอบของคุณเหมาะสม แต่ก็ไม่ได้หมายความว่าของฉันผิดและดังนั้นฉันจึงลงคะแนน
Maxim Shoustin

ฉันลองแปลงทุกอย่าง\nไป<br/>เป็นแล้วแน่นอนว่าแท็กเหล่านี้ไม่ได้ถูกแสดงผลเป็นมาร์กอัป HTML ... หลังจากการแปลงทั้งหมดพบstyleวิธีแก้ปัญหาของคุณและนี่คือความช่วยเหลือและความเรียบง่ายที่เหลือเชื่อ ... ตอนนี้ฉันไม่ ต้องแปลงข้อมูลแบ็กเอนด์ของฉันไปเรื่อย ๆ และทำการเปลี่ยนแปลงเล็กน้อยในมุมมอง ... คุณสมควรได้รับ +1000!
twknab

ใช้งานได้กับรหัส แต่ไม่ใช่เพื่อแสดงข้อความถึงผู้ใช้ ฉันคิดว่าคำตอบของ Paul เป็นคำตอบที่ถูกต้อง
Quintonn

63

มันง่ายมากกับ CSS (ใช้งานได้ฉันสาบาน)

.angular-with-newlines {
  white-space: pre;
}
  • ดูสิ! ไม่มีแท็ก HTML เพิ่มเติม!

@pilau ฉันต้องการห่อข้อความถ้ามีเครื่องหมายจุลภาค (,) ไม่ใช่ white space ฉันจะทำสิ่งนี้ได้อย่างไร
Shylendra Madda

@shylendra วิธีการแก้ปัญหาของฉันไม่ได้ห่อข้อความมันทำให้มันทำงานเหมือนอยู่ในpreแท็ก อาจเปิดคำถามอื่นได้หรือไม่ หรือบางทีฉันอาจพลาดจุดของคุณ?
pilau

ฉันสงสัยเกี่ยวกับความเข้ากันได้ของเบราว์เซอร์ ตามแผนภูมินี้ดูเหมือนว่าจะทำงานในเบราว์เซอร์หลักทั้งหมด มันยุ่งยากน้อยกว่าการแทนที่บรรทัดใหม่ด้วยแท็ก br ขอบคุณ! เพียงให้ความสนใจกับการจัดรูปแบบรหัสดังนั้นจึงไม่มีช่องว่างพวกเขาจะปรากฏขึ้นแน่นอน developer.mozilla.org/en-US/docs/Web/CSS/white-space
Paul Weber

อาจดีกว่าถ้าใช้ 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 ใช้งานได้ แต่คุณไม่สามารถควบคุมการออกแบบได้ ในกรณีของฉันฉันต้องการพื้นที่เพิ่มอีกเล็กน้อยหลังจากแบ่งบรรทัด นี่เป็นคำสั่งที่ฉันสร้างขึ้นเพื่อจัดการกับสิ่งนี้ (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.