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?

Diolor
sumber
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

Paul Weber
sumber
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)

Maxim Shoustin
sumber
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
sumber
@ 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

Rehan
sumber
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.

Nicolas Brugneaux
sumber
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.

Dmitry Efimenko
sumber
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
}
Akitha_MJ
sumber
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!

Siddhartha Thota
sumber
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.

Chris Rae
sumber