Angularjs'de satır sonlarını koru


176

Ben gördüm Bu SO sorusunu .

Yerine Kodum ng-bind="item.desc"kullanımları{{item.desc}} çünkü bir ng-repeatönce var.

Yani kodum:

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

Öğe açıklaması içerir \n oluşturulmamış yeni satırlar .

Yukarıdakilere {{item.description}}sahip olduğumu varsayarak yeni satırları nasıl görüntüleyebilirim ng-repeat?


Bir <pre> etiketine koy?
aet

88
Sarıcı stil ile divbirlikte style="white-space:pre-wrap;".
Stewie

1
@Stewie'nin yorumu benim için mükemmel çalışıyor (AngularJS 1.2.18), bireysel öğenin nasıl stilize edileceğini (pilau ve Paul Weber'in çözümünün aksine) ve <pre> etiketinin stillerini diğerleri gibi değiştirmeye gerek olmadığını açıkça gösteriyor önerdi.
Andre Holzner

Haklısın, herkesin temel css'i nasıl kullanacağını bildiğini ve bir öğeye sınıf uygulayacağını varsaydım. Stewie bir cevap olarak yorumunu yayınlasaydı, onun için daha iyi olurdu. Sanki yeterli puanı varmış gibi görünüyor ...
Paul Weber

Katılıyorum, @Stewie kesinlikle bir cevap olarak yorumunu biçimlendirmeliydi. Sorunumu mükemmel şekilde düzeltti.
CF_HoneyBadger

Yanıtlar:


285

@Pilau'nun cevabına dayanır - ancak kabul edilen cevabın bile olmadığı bir iyileştirme ile.

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

Bu, belirtildiği gibi yeni satırları ve boşlukları kullanır, ancak içerik sınırlarındaki içeriği de keser. Beyaz boşluk özelliği hakkında daha fazla bilgiyi burada bulabilirsiniz:

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

Yeni satırları kırmak, ancak metinden önce birden çok alanı veya beyaz alanı daraltmak istiyorsanız (orijinal tarayıcı davranışına çok benzer), @aaki'nin önerdiği gibi kullanabilirsiniz:

white-space: pre-line;

Farklı oluşturma modlarının güzel karşılaştırması: http://meyerweb.com/eric/css/tests/white-space.html


1
Pre gibi tek aralıklı yazı tipine dayanmadığı için IMO'nun en iyi çözümü.
Troels Larsen

1
Korunacak metinden önce gelen beyaz boşluğu izleyin.
Silver Paladin

1
Onu büyüttüğünüz pre-lineiçin tercih edilen olmaz mı? HTML'nin genellikle düğümlerinin metin içeriğini oluşturma ve yeni satırları koruma biçimine daha yakındır.
aaki

Hmm ... haklısın, ön çizgi daha iyi bir çözüm, artık ön çizgi yerine neden ön sargıyı seçtiğimi bilmiyorum. Belki de ön hat için tarayıcı desteği o kadar iyi değil? Ama bunu cevaba ekleyeceğim ... İşte yorumların bir karşılaştırması: meyerweb.com/eric/css/tests/white-space.html
Paul Weber

Bu kabul edilen cevap olmalı! pre-linegitmek için bir yoldur. Teşekkürler Paul!
demisx

126

Deneyin:

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

<pre>Sarıcı ile metin yazdırır \nmetin olarak

ayrıca json yazdırırsanız, daha iyi bir görünüm için jsonfiltre kullanın , örneğin:

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

Demo

Yine de kullanarak daha iyi bir yaklaşım @Paul Weberolduğunu kabul ediyorum - çoğunlukla bazı şeyleri hata ayıklamak için hızlı bir şekilde (stil üzerinde zaman kaybetmek istemiyorsanız)white-space: pre-wrap;<pre>


İtem.description, bilmediğim \nalanlarda sonunda olmayan metin . Sanırım predüzenlemenize göre ihtiyacım var .
Diolor

29
Çoğu zaman, bir <pre> etiketi metni kuryeye dönüştürdüğü ve sayfanın stilini bozduğu için iyi bir çözüm değildir. Stil = "beyaz boşluk: ön sarma;" çözüm daha iyi bir çözüm gibi görünüyor (en azından benim durumum için)
CF_HoneyBadger

1
@CF_HoneyBadger iyi, çünkü @pilaucevabınız doğru olanı ama benimkinin yanlış olduğu anlamına gelmiyor ve bu yüzden aşağı indirildim
Maxim Shoustin

Bütün dönüştürme çalıştı \n'olarak bitti <br/>s' ve tüm bu bulundu dönüştürülmesiyle sonra sonra tabii bu etiketleri HTML biçimlendirme ... olarak işlenir değil alındı styleçözümü ve bu inanılmaz bir yardım ve basitleştirme olduğunu ... şimdi yok tüm arka uç verilerimi dönüştürmeye devam etmeli ve Görünümde birkaç değişiklik yapmalıyım ... +1000'i hak ediyorsunuz!
twknab

Bu kod için çalışır, ancak kullanıcılara mesaj göstermek için geçerli değildir. Paul'un cevabı doğru olduğunu düşünüyorum
Quintonn

63

CSS ile çok basit (işe yarıyor, yemin ederim).

.angular-with-newlines {
  white-space: pre;
}
  • Bak anne! Ek HTML etiketi yok!

@pilau Beyaz boşluk değil, virgül (,) içeriyorsa metni sarmak istiyorum, bunu nasıl yapabilirim?
Shylendra Madda

@ shylendra çözümüm metni sarmıyor, sanki bir preetiketin içindeymiş gibi davranıyor . Belki başka bir soru açar? Ya da belki fikrini kaçırdım?
pilau

Tarayıcı uyumluluğunu merak ediyordum. Bu tabloya göre, tüm büyük tarayıcılarda çalışıyor gibi görünüyor. Yeni satırları br etiketleriyle değiştirmekten çok daha az güçlük çekiyor. Teşekkürler! Kodu, boşluk içermeyecek şekilde biçimlendirmeye dikkat edin, elbette görünecekler. developer.mozilla.org/tr-TR/docs/Web/CSS/white-space
Paul Weber

Beyaz boşluk kullanmak daha da iyi olabilir: önceden sarın, aksi takdirde içerik asla sarılmaz.
Paul Weber

16

CSS ile bu kolayca elde edilebilir.

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

Veya bu amaçla bir CSS sınıfı oluşturulabilir ve harici CSS dosyasından kullanılabilir


2

Peki, bağlama veriler istiyorsanız, içinde biçimlendirme herhangi olmamalıdır, bağlı aksi yapabilirsiniz bind-htmlve yapılacak description.replace(/\\n/g, '<br>') bu hesabın olsa istediği bu değil.


1

css çözümü çalışıyor, ancak stil üzerinde gerçekten kontrol sahibi değilsiniz. Benim durumumda, satır sonundan sonra biraz daha yer istedim. İşte bu (typescript) işlemek için oluşturulan bir direktif:

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

kullanın:

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

Tek yaptığı, metnin her bir parçasını bir <p>etikete sarmaktır. Bundan sonra istediğiniz gibi şekillendirebilirsiniz.


1

Sadece bunu stillerinize ekleyin, bu benim için çalışıyor

white-space: pre-wrap

İçindeki bu metinle <textarea> ile orada boşluklar ve hat frenleri ile olduğu gibi görüntülenebilir

HTML

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

CSS

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


0

Sadece "white-space: pre-wrap" css stilini kullanın ve gitmek için iyi olmalısınız. Satır kesmeleri ve beyaz boşluklar gerçekten özel olan hata mesajlarını işlemem gereken aynı sorunu yaşadım. Verileri bağladığım bu satır içi çizgiyi ekledim ve Charm gibi çalışıyor!


0

Sana da benzer bir sorun yaşadım. Buradaki diğer cevaplara çok hevesli değilim çünkü satırsonu davranışını çok kolay şekillendirmenize gerçekten izin vermiyorlar. Orijinal veri üzerinde kontrolünüz olup olmadığından emin değilim, ancak benimsediğim çözüm, "dizinin" diziden oluşan bir dizi olmaktan, ikinci dizideki her öğenin bir metin satırı içerdiği diziler dizisine geçmesini sağlamaktı. . Bu şekilde şöyle bir şey yapabilirsiniz:

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

Bu şekilde sınıfları paragraflara uygulayabilir ve CSS ile güzelce biçimlendirebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.