कोई अन्य HTML के साथ angularjs newline फ़िल्टर


86

मैं newline वर्ण ( \n) को html में बदलने की कोशिश कर रहा हूँ brGoogle समूह में इस चर्चा के
अनुसार , मुझे यहाँ क्या मिला है:

myApp.filter('newlines', function () {
    return function(text) {
        return text.replace(/\n/g, '<br/>');
    }
});

वहाँ की चर्चा भी दृश्य में निम्नलिखित का उपयोग करने की सलाह देती है:

{{ dataFromModel | newline | html }}

ऐसा लगता है कि पुराने htmlफ़िल्टर का उपयोग किया जा रहा है , जबकि अब हम ng-bind-htmlविशेषता का उपयोग करने वाले हैं ।


इसके बावजूद, यह एक समस्या बनती है: मैं नहीं चाहता कि मूल स्ट्रिंग से कोई HTML ( dataFromModel) HTML के रूप में प्रदान किया जाए; केवल br'एस।

उदाहरण के लिए, निम्नलिखित स्ट्रिंग दी गई है:

जबकि 7> 5
मुझे अभी भी html और सामान यहाँ नहीं चाहिए ...

मैं इसे आउटपुट करना चाहता हूं:

While 7 &gt; 5<br>I still don't want html &amp; stuff in here...

क्या इसे पूरा करने का कोई रास्ता है?

जवाबों:


278

शायद आप इसे केवल html, एक <preformated text>तरह से प्राप्त कर सकते हैं ? यह फिल्टर का उपयोग करने या किसी भी प्रकार की प्रोसेसिंग करने से बचना होगा।

आपको बस उस तत्व के भीतर पाठ प्रदर्शित करना है जिसमें यह CSS है:

<p style="white-space: pre;">{{ MyMultiLineText}}</p>

यह नई लाइनों के रूप में पार्स और प्रदर्शित करेगा। मेरे लिए महान काम करता है।

यहाँ, एक jsFiddle उदाहरण


79
प्री-लाइन, मेरे लिए एक बेहतर विकल्प था।
पेपिज

7
+1, यह अब तक का सबसे सरल उपाय है और कई जरूरतों के लिए उपयुक्त लगता है। वास्तव में, pre-lineसंभवतः सामान्य रूप से बेहतर है, क्योंकि लंबी पंक्तियों को लपेटा जाएगा (जैसा कि वे किसी भी <br>आधारित समाधान के साथ होगा )।
tuomassalo

13
शैली = "सफेद-स्थान: पूर्व-रेखा;" <div> के अंदर उपयोग करने के लिए बेहतर विकल्प है, मेरी राय में
दिमित्री अल्गाज़िन

7
pre-wrapऐसा लगता है कि अधिकांश लोग चाहते हैं (प्री-लाइन नहीं): "व्हॉट्सएप ब्राउज़र द्वारा संरक्षित है। आवश्यक होने पर टेक्स्ट रैप करेगा और लाइन टूट जाएगा" w3schools से
qwertzguy

2
मैंने पाया कि मुझे अपने पाठ में Chrome की अतिरिक्त लाइनों को जोड़ने से रोकने के लिए <p> पर एनजी-बिंद = "MyMultiLineText" का उपयोग करने की आवश्यकता है
स्कॉट वॉरेन

33

नए निर्देशों के साथ खिलवाड़ करने के बजाय, मैंने केवल 2 फ़िल्टर का उपयोग करने का निर्णय लिया:

App.filter('newlines', function () {
    return function(text) {
        return text.replace(/\n/g, '<br/>');
    }
})
.filter('noHTML', function () {
    return function(text) {
        return text
                .replace(/&/g, '&amp;')
                .replace(/>/g, '&gt;')
                .replace(/</g, '&lt;');
    }
});

फिर, मेरे विचार में, मैं एक दूसरे को पाइप करता हूं:

<span ng-bind-html-unsafe="dataFromModel | noHTML | newlines"></span>

नई लाइनों के लिए आपका regex 'काम नहीं करेगा। आपको इसकी आवश्यकता है: text.replace(/\\n/g, '<br />')या इससे भी बेहतरtext.replace(/(\\r)?\\n/g, '<br />')
बार्टोमोइज ज़ाल्वस्की

2
@BarthZalewski - जब आप एक स्ट्रिंग से एक regex संकलित करने के लिए केवल `\` की जरूरत है। रेगेक्स शाब्दिक का उपयोग करते समय आपको स्लैश से बचना नहीं पड़ता है।
मेगाहिट

2
यह कोड अब काम नहीं करता क्योंकि एनजी-बिंद-एचटीएमएल-असुरक्षित पदावनत है।
अभि

1
यदि आप चाहें तो अब आप noHtml फ़िल्टर को छोड़ सकते हैं और एनजी-बाइंड-html में newLines फ़िल्टर जोड़ सकते हैं। ngSanitize बाकी का ध्यान रखेगा।
डेव मेरविन

26

ऐसा करने का एक सरल तरीका यह है कि एक फ़िल्टर बनाया जाए जो प्रत्येक \nसूची में पाठ को विभाजित करता है , और फिर `एनजी-रिपीट 'का उपयोग करता है।

फ़िल्टर:

App.filter('newlines', function() {
  return function(text) {
    return text.split(/\n/g);
  };
});

और HTML में:

<span ng-repeat="line in (text | newlines) track by $index">
    <p> {{line}}</p>
    <br>
</span>

4
मुझे यह समाधान पसंद है, लेकिन सरल HTML के साथ जाना होगा:<p ng-repeat="line in (line.message | newlines)">{{line}}</p>
थॉमस फनकौशर

2
अच्छा उत्तर, लेकिन track byडुप्लिकेट लाइनों के मामले में बेहतर उपयोग , जो एक त्रुटि पैदा करेगा line in (text | newlines) track by $index:।
जेल्लेकैट

11

यदि आप अंतहीन तारों के साथ लेआउट को नष्ट नहीं करना चाहते हैं, तो प्री-लाइन का उपयोग करें:

<p style="white-space: pre-line;">{{ MyMultiLineText}}</p>

6

मुझे पता नहीं है कि यदि कोणीय में html को स्ट्रिप करने की सेवा है, लेकिन ऐसा लगता है कि आपको अपना newlinesकस्टम फ़िल्टर पास करने से पहले html को हटाने की आवश्यकता है । जिस तरह से मैं करूँगा वह एक कस्टम no-htmlनिर्देश के माध्यम से होता है, जिसे निकालने के बाद लागू करने के लिए एक स्कोप प्रॉपर्टी और एक फ़िल्टर का नाम दिया जाएगा।html

<div no-html="data" post-filter="newlines"></div>

यहाँ कार्यान्वयन है

app.directive('noHtml', function($filter){
  return function(scope, element, attrs){
    var html = scope[attrs.noHtml];
    var text = angular.element("<div>").html(html).text();

    // post filter
    var filter = attrs.postFilter;
    var result = $filter(filter)(text);

    // apending html
    element.html(result);
  };
});

महत्वपूर्ण बिट textचर है। यहां मैं एक मध्यवर्ती DOM तत्व बनाता हूं और इसे htmlविधि का उपयोग करके HTML को जोड़ देता हूं और फिर textविधि के साथ केवल पाठ को पुनः प्राप्त करता हूं । दोनों तरीके jQuery के Angular के लाइट संस्करण द्वारा प्रदान किए गए हैं ।

निम्नलिखित भाग newlineफ़िल्टर लागू कर रहा है , जो $filterसेवा का उपयोग करके किया जाता है ।

यहाँ प्लंकर की जाँच करें: http://plnkr.co/edit/SEtHH5eUgFEtC92Czq7T?p=preview


2

वर्तमान में एनजी-बिंद-एचटीएमएल के साथ फिल्टर के लिए एक अपडेट होगा:

myApp.filter('newlines', function () {
  return function(text) {
    return text.replace(/(&#13;)?&#10;/g, '<br/>');
  }
});

और noHTML फ़िल्टर की आवश्यकता नहीं है।

व्हाइट-स्पेस सॉल्यूशन में कम ब्राउज़र सपोर्ट है: http://caniuse.com/#search=tab-size


0

इस पर पार्टी के लिए थोड़ी देर हो गई है लेकिन मैं अपरिभाषित / अशक्त तारों की जांच करने के लिए एक छोटे से सुधार का सुझाव दूंगा।

कुछ इस तरह:

.filter('newlines', function () {
    return function(text) {
        return (text) ? text.replace(/(&#13;)?&#10;/g, '<br/>') : text;
    };
})

या (थोड़ा तंग)

.filter('newlines', function () {
    return function(text) {
        return (text instanceof String || typeof text === "string") ? text.replace(/(&#13;)?&#10;/g, '<br/>') : text;
    };
})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.