Bảo toàn ngắt dòng trong angularjs


176

Tôi đã thấy câu hỏi SO này .

Mã của tôi thay vì ng-bind="item.desc"sử dụng {{item.desc}}vì tôi có ng-repeattrước đây.

Mã của tôi:

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

Mô tả mục chứa \ncác dòng mới không được hiển thị.

Làm thế nào để {{item.description}}hiển thị các dòng mới dễ dàng giả định rằng tôi có ng-repeatở trên?


Đặt nó trong một thẻ <pre>?
AET

88
Bằng cách tạo kiểu bao bọc divvới style="white-space:pre-wrap;".
Stewie

1
Nhận xét của @Stewie hoạt động hoàn hảo đối với tôi (AngularJS 1.2.18), nó cho thấy rõ cách tạo kiểu cho phần tử riêng lẻ (trái ngược với giải pháp của pilau và Paul Weber) và không cần thay đổi kiểu của thẻ <pre> như những người khác đề xuất.
Andre Holzner

Bạn nói đúng, tôi giả sử rằng mọi người đều biết cách sử dụng css cơ bản và áp dụng một lớp cho một phần tử. Nếu Stewie đã đăng bình luận của mình như một câu trả lời thì nó sẽ tốt hơn cho anh ta. Mặc dù có vẻ như anh ta có đủ điểm ...
Paul Weber

Tôi đồng ý, @Stewie chắc chắn nên định dạng bình luận của mình như một câu trả lời. Nó đã khắc phục vấn đề của tôi một cách hoàn hảo.
CF_HoneyBadger

Câu trả lời:


285

Dựa trên câu trả lời của @pilau - nhưng với một sự cải tiến mà ngay cả câu trả lời được chấp nhận cũng không có.

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

Điều này sẽ sử dụng dòng mới và khoảng trắng như đã cho, nhưng cũng phá vỡ nội dung ở ranh giới nội dung. Thông tin thêm về tài sản không gian trắng có thể được tìm thấy ở đây:

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

Nếu bạn muốn ngắt dòng mới, nhưng cũng thu gọn nhiều khoảng trắng hoặc khoảng trắng đi trước văn bản (rất giống với hành vi trình duyệt ban đầu), bạn có thể sử dụng, như @aaki đề xuất:

white-space: pre-line;

So sánh tốt các chế độ kết xuất khác nhau: http://meyerweb.com/eric/css/tests/white-space.html


1
Giải pháp tốt nhất ở đây IMO, vì nó không kết hợp lại với một phông chữ đơn cách như trước.
Quân đội Larsen

1
Xem khoảng trắng trước văn bản, sẽ được giữ nguyên.
Bạc Paladin

1
Vì bạn đã đưa nó lên sẽ không được pre-lineưa thích? Nó gần với cách HTML thường kết xuất nội dung văn bản của các nút của nó và vẫn giữ nguyên các dòng mới.
aaki

Hmm ... bạn nói đúng, tiền tuyến là giải pháp tốt hơn, sau khi tôi không chắc chắn nữa tại sao tôi chọn gói trước thay vì tiền tuyến. Có lẽ trình duyệt hỗ trợ cho tiền tuyến không tốt bằng? Nhưng tôi sẽ thêm câu này vào câu trả lời ... Dưới đây là so sánh các kết xuất: meyerweb.com/eric/css/tests/white-space.html
Paul Weber

Đây phải là câu trả lời được chấp nhận! pre-linelà con đường để đi Cảm ơn Paul!
demisx

126

Thử:

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

Trình <pre>bao bọc sẽ in văn bản \ndưới dạng văn bản

Ngoài ra, nếu bạn in json, để nhìn tốt hơn, hãy sử dụng jsonbộ lọc, như:

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

Demo

Tôi đồng ý với @Paul Weberđiều đó white-space: pre-wrap;là cách tiếp cận tốt hơn, dù sao sử dụng <pre>- cách nhanh chóng chủ yếu để gỡ lỗi một số nội dung (nếu bạn không muốn lãng phí thời gian vào phong cách)


Mục mô tả là văn bản có các \nkhu vực mà tôi không biết, không phải ở cuối. Tôi nghĩ rằng tôi cần predựa trên chỉnh sửa của bạn.
Diolor

29
Rất nhiều lần, thẻ <pre> không phải là một giải pháp tốt vì nó biến văn bản thành chuyển phát nhanh và phá vỡ phong cách của trang. Phong cách = "khoảng trắng: gói trước;" giải pháp có vẻ là một giải pháp tốt hơn (ít nhất là cho tình huống của tôi)
CF_HoneyBadger

1
@CF_HoneyBadger tốt, vì @pilaucâu trả lời của bạn là đúng nhưng điều đó không có nghĩa là tôi sai và do đó tôi đã bị từ
chối

Tôi cố gắng chuyển đổi tất cả \nđã qua để <br/>'s và sau đó dĩ nhiên các thẻ đã không được trả lại dưới dạng HTML markup ... sau khi tất cả điều này chuyển đổi tìm thấy bạn stylegiải pháp và điều này là một sự giúp đỡ tuyệt vời và đơn giản hóa ... bây giờ tôi không phải tiếp tục chuyển đổi xung quanh tất cả dữ liệu phụ trợ của tôi và chỉ cần thực hiện một vài thay đổi trong Chế độ xem ... Bạn xứng đáng được +1000!
twknab

Điều này hoạt động cho mã, nhưng không phải để hiển thị tin nhắn cho người dùng chẳng hạn. Tôi nghĩ câu trả lời của Paul là câu trả lời đúng
Quintonn

63

Thật đơn giản với CSS (nó hoạt động, tôi thề).

.angular-with-newlines {
  white-space: pre;
}
  • Nhìn ma đi! Không có thẻ HTML bổ sung!

@pilau Tôi muốn bọc văn bản nếu nó chứa dấu phẩy (,) không phải khoảng trắng làm sao tôi có thể làm điều này?
Shylendra Madda

@shylendra giải pháp của tôi không bao bọc văn bản, nó làm cho nó hoạt động như thể nó nằm trong một prethẻ. Có lẽ mở một câu hỏi khác? Hoặc có thể tôi đã bỏ lỡ quan điểm của bạn?
pilau

Tôi đã tự hỏi về khả năng tương thích trình duyệt. Theo biểu đồ này, nó dường như hoạt động trong tất cả các trình duyệt chính. Nó ít rắc rối hơn nhiều so với việc thay thế dòng mới bằng thẻ br. Cảm ơn! Chỉ cần chú ý định dạng mã để nó không chứa khoảng trắng, tất nhiên chúng sẽ hiển thị. developer.mozilla.org/en-US/docs/Web/CSS/white-space
Paul Weber

Có thể còn tốt hơn khi sử dụng khoảng trắng: bọc trước, nếu không thì nội dung sẽ không bao giờ được bọc.
Paul Weber

16

Với CSS, điều này có thể đạt được một cách dễ dàng.

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

Hoặc một lớp CSS có thể được tạo cho mục đích này và có thể được sử dụng từ tệp CSS bên ngoài


2

Vâng, điều đó còn tùy thuộc, nếu bạn muốn liên kết dữ liệu, không nên có bất kỳ định dạng nào trong đó, nếu không bạn có thể bind-htmldescription.replace(/\\n/g, '<br>') không chắc chắn đó là những gì bạn muốn.


1

giải pháp css hoạt động, tuy nhiên bạn không thực sự kiểm soát được kiểu dáng. Trong trường hợp của tôi, tôi muốn có thêm một chút không gian sau khi ngắt dòng. Đây là một lệnh tôi đã tạo để xử lý việc này (bản đánh máy):

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

Sử dụng:

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

Tất cả những gì nó làm là kết thúc từng phần của văn bản vào một <p>thẻ. Sau đó, bạn có thể tạo kiểu theo cách bạn muốn.


1

Chỉ cần thêm nó vào phong cách của bạn, điều này làm việc cho tôi

white-space: pre-wrap

Bằng văn bản này <textarea>có thể được hiển thị khi nó ở đó với không gian và phanh dòng

HTML

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

CSS

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


0

Chỉ cần sử dụng kiểu css "trắng-space: pre-quấn" và bạn sẽ thấy ổn. Tôi đã có cùng một vấn đề khi tôi cần xử lý các thông báo lỗi mà đường ngắt và khoảng trắng thực sự đặc biệt. Tôi vừa thêm nội tuyến này vào nơi tôi đang ràng buộc dữ liệu và nó hoạt động như Charm!


0

Tôi đã có một vấn đề tương tự với bạn. Tôi không quan tâm đến các câu trả lời khác ở đây vì chúng không thực sự cho phép bạn tạo kiểu hành vi dòng mới rất dễ dàng. Tôi không chắc liệu bạn có kiểm soát dữ liệu gốc hay không, nhưng giải pháp tôi đã áp dụng là chuyển "các mục" từ một chuỗi các chuỗi thành một mảng các mảng, trong đó mỗi mục trong mảng thứ hai chứa một dòng văn bản . Bằng cách đó bạn có thể làm một cái gì đó như:

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

Bằng cách này, bạn có thể áp dụng các lớp cho các đoạn văn và tạo kiểu cho chúng độc đáo bằng CSS.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.