Pertahankan jeda baris dalam angularjs


176

Saya telah melihat pertanyaan SO ini .

Kode saya alih-alih ng-bind="item.desc"menggunakan {{item.desc}}karena saya punya ng-repeatsebelumnya.

Jadi kode saya:

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

Deskripsi item berisi \nbaris baru yang tidak dirender.

Bagaimana cara {{item.description}}menampilkan baris baru dengan mudah dengan asumsi saya memiliki di ng-repeatatas?


Taruh di tag <pre>?
aet

88
Dengan menata pembungkus divdengan style="white-space:pre-wrap;".
Stewie

1
Komentar @Stewie bekerja dengan baik untuk saya (AngularJS 1.2.18), itu secara eksplisit menunjukkan bagaimana gaya elemen individu (yang bertentangan dengan solusi Pilau dan Paul Weber) dan tidak perlu mengubah gaya tag <pre> seperti yang lain diusulkan.
Andre Holzner

Anda benar, saya berasumsi bahwa semua orang tahu cara menggunakan css dasar dan menerapkan kelas ke elemen. Jika Stewie memposting komentarnya sebagai jawaban, itu akan lebih baik baginya. Meskipun sepertinya dia punya cukup poin ...
Paul Weber

Saya setuju, @Stewie seharusnya memformat komentarnya sebagai jawaban. Itu memperbaiki masalah saya dengan sempurna.
CF_HoneyBadger

Jawaban:


285

Berdasarkan jawaban @pilau - tetapi dengan peningkatan yang bahkan jawaban yang diterima tidak memiliki.

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

Ini akan menggunakan baris baru dan spasi putih seperti yang diberikan, tetapi juga memecah konten di batas konten. Informasi lebih lanjut tentang properti white-space dapat ditemukan di sini:

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

Jika Anda ingin memecah baris baru, tetapi juga menciutkan banyak spasi atau ruang putih sebelum teks (sangat mirip dengan perilaku browser asli), Anda dapat menggunakan, seperti yang disarankan @aaki:

white-space: pre-line;

Perbandingan mode rendering yang berbeda: http://meyerweb.com/eric/css/tests/white-space.html


1
Solusi terbaik di sini IMO, karena tidak mengubah gaya ke font mono-spaced seperti pra.
Troels Larsen

1
Tonton ruang putih sebelum teks, yang akan dipertahankan.
Silver Paladin

1
Karena Anda membawanya bukankah yang akan pre-linedisukai? Ini lebih dekat dengan cara HTML biasanya membuat konten teks dari node-nya dan tetap mempertahankan baris baru.
aaki

Hmm ... Anda benar, pre-line adalah solusi yang lebih baik, setelah saya tidak yakin lagi mengapa saya memilih pre-wrap daripada pre-line. Mungkin dukungan browser untuk pre-line tidak sebaik ini? Tetapi saya akan menambahkan ini ke jawabannya ... Berikut ini adalah perbandingan renderingnya: meyerweb.com/eric/css/tests/white-space.html
Paul Weber

Ini harus menjadi jawaban yang diterima! pre-lineadalah cara untuk pergi. Terima kasih paul!
demisx

126

Mencoba:

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

The <pre>wrapper akan mencetak teks dengan \nsebagai teks

juga jika Anda mencetak json, agar lebih baik gunakan jsonfilter, seperti:

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

Demo

Saya setuju dengan @Paul Weberitu white-space: pre-wrap;adalah pendekatan yang lebih baik, bagaimanapun menggunakan <pre>- cara cepat sebagian besar untuk men-debug beberapa hal (jika Anda tidak ingin membuang waktu untuk styling)


Deskripsi item.description adalah teks yang memiliki \ndalam bidang yang saya tidak tahu, tidak pada akhirnya. Saya pikir saya perlu preberdasarkan hasil edit Anda.
Diolor

29
Sering kali, tag <pre> bukan solusi yang baik karena mengubah teks menjadi kurir dan memecah gaya halaman. Style = "white-space: pre-wrap;" solusi tampaknya menjadi solusi yang lebih baik (setidaknya untuk situasi saya)
CF_HoneyBadger

1
@CF_HoneyBadger dengan baik, karena @pilaujawaban Anda benar, tetapi itu tidak berarti bahwa jawaban saya salah dan karena itu saya
diturunkan

Saya mencoba mengubah semua \nmenjadi <br/>dan kemudian tentu saja tag ini tidak diterjemahkan sebagai markup HTML ... setelah semua konversi ini menemukan stylesolusi Anda dan ini adalah bantuan dan penyederhanaan yang luar biasa ... sekarang saya tidak harus terus mengonversi semua data backend saya dan hanya membuat beberapa perubahan dalam Tampilan ... Anda layak +1000!
twknab

Ini berfungsi untuk kode, tetapi tidak untuk menunjukkan pesan kepada pengguna misalnya. Saya pikir jawaban Paul adalah yang benar
Quintonn

63

Ini sangat sederhana dengan CSS (berfungsi, saya bersumpah).

.angular-with-newlines {
  white-space: pre;
}
  • Lihat bu! Tidak ada tag HTML tambahan!

@ Pilau Saya ingin membungkus teks jika mengandung koma (,) bukan spasi putih bagaimana saya bisa melakukan ini?
Shylendra Madda

@shylendra solusi saya tidak membungkus teks, itu membuatnya berperilaku seolah-olah itu dalam pretag. Mungkin membuka pertanyaan lain? Atau mungkin saya melewatkan poin Anda?
pilau

Saya bertanya-tanya tentang kompatibilitas browser. Menurut bagan ini, tampaknya berfungsi di semua browser utama. Ini jauh lebih mudah daripada mengganti baris baru dengan tag br. Terima kasih! Perhatikan memformat kode sehingga tidak mengandung spasi, mereka akan muncul tentu saja. developer.mozilla.org/en-US/docs/Web/CSS/white-space
Paul Weber

Mungkin lebih baik menggunakan white-space: pre-wrap, kalau tidak konten tidak akan pernah membungkus.
Paul Weber

16

Dengan CSS ini dapat dicapai dengan mudah.

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

Atau kelas CSS dapat dibuat untuk tujuan ini dan dapat digunakan dari file CSS eksternal


2

Yah itu tergantung, jika Anda ingin mengikat data, seharusnya tidak ada format di dalamnya, jika tidak Anda bisa bind-htmldan description.replace(/\\n/g, '<br>') tidak yakin itu yang Anda inginkan.


1

solusi css bekerja, namun Anda tidak benar-benar mendapatkan kontrol pada penataan. Dalam kasus saya, saya ingin sedikit lebih banyak ruang setelah jeda baris. Berikut adalah arahan yang saya buat untuk menangani ini (naskah):

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

Menggunakan:

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

Yang dilakukannya hanyalah membungkus setiap bagian teks menjadi sebuah <p>tag. Setelah itu Anda bisa menatanya sesuka Anda.


1

Cukup tambahkan ini ke gaya Anda, ini bekerja untuk saya

white-space: pre-wrap

Dengan teks ini <textarea>dapat ditampilkan karena ada di sana dengan spasi dan rem garis

HTML

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

CSS

.text-style{
    white-space: pre-wrap
}


0

Cukup gunakan gaya css "white-space: pre-wrap" dan Anda harus siap. Saya pernah mengalami masalah yang sama di mana saya perlu menangani pesan kesalahan yang garis putus dan spasi putih benar-benar khusus. Saya baru saja menambahkan inline ini di mana saya mengikat data dan berfungsi seperti Charm!


0

Saya punya masalah yang sama dengan Anda. Saya tidak terlalu tertarik pada jawaban lain di sini karena mereka tidak benar-benar memungkinkan Anda untuk merancang perilaku baris baru dengan sangat mudah. Saya tidak yakin apakah Anda memiliki kontrol atas data asli, tetapi solusi yang saya adopsi adalah untuk beralih "item" dari menjadi array string menjadi array array, di mana setiap item dalam array kedua berisi baris teks . Dengan begitu Anda dapat melakukan sesuatu seperti:

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

Dengan cara ini Anda bisa menerapkan kelas pada paragraf dan menatanya dengan CSS.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.