Angular 2 ไปป์ที่เปลี่ยนออบเจ็กต์ JSON เป็น JSON ที่พิมพ์ออกมาได้สวย


105

พยายามเขียนไปป์ Angular 2 ที่จะใช้สตริงอ็อบเจ็กต์ JSON และส่งคืนรูปแบบ / รูปแบบที่สวยงามเพื่อแสดงต่อผู้ใช้

ตัวอย่างเช่นจะใช้สิ่งนี้:

{"id": 1, "number": "K3483483344", "state": "CA", "active": true}

และส่งคืนสิ่งที่มีลักษณะเช่นนี้เมื่อแสดงใน HTML:

ป้อนคำอธิบายภาพที่นี่

ดังนั้นในมุมมองของฉันฉันสามารถมีบางอย่างเช่น:

<td> {{ record.jsonData | prettyprint }} </td>

1
ดูเหมือนว่าคุณต้องการสร้างไปป์ที่กำหนดเอง นี่คือบางส่วนเอกสาร: angular.io/docs/ts/latest/guide/pipes.html#!#custom-pipes ลองใช้และหากคุณ
ประสบปัญหาอย่า

คำตอบ:


312

ฉันต้องการเพิ่มวิธีที่ง่ายกว่านี้โดยใช้jsonท่อในตัว:

<pre>{{data | json}}</pre>

วิธีนี้การจัดรูปแบบจะถูกเก็บรักษาไว้


ขอบคุณที่สมบูรณ์แบบ!
laurent

5
เห็นได้ชัดว่าฉันให้คะแนนคุณเพราะฉันละอายใจที่ค้นหา: p
Capy

1
@Shane Hsu ท่อ json ในตัวไม่ทำงาน ฉันใช้สตริงเพื่อทำให้ json สวย กรุณาไปที่ลิงค์นี้ซึ่งฉันตั้งคำถาม stackoverflow.com/questions/57405561/…
Venkateswaran R

ดังนั้นจึงเป็นกรณี ๆ ไป :(
Vibhor Dube

1
เย็น. โปรดทราบว่าการจัดรูปแบบต้อง<pre>และจะไม่ทำงานกับเช่น<p>, <span>ฯลฯ
Jeppe

22

ฉันจะสร้างท่อที่กำหนดเองสำหรับสิ่งนี้:

@Pipe({
  name: 'prettyprint'
})
export class PrettyPrintPipe implements PipeTransform {
  transform(val) {
    return JSON.stringify(val, null, 2)
      .replace(' ', '&nbsp;')
      .replace('\n', '<br/>');
  }
}

และใช้วิธีนี้:

@Component({
  selector: 'my-app',
  template: `
    <div [innerHTML]="obj | prettyprint"></div>
  `,
  pipes: [ PrettyPrintPipe ]
})
export class AppComponent {
  obj = {
    test: 'testttt',
    name: 'nameeee'
  }
}

ดู stackblitz นี้: https://stackblitz.com/edit/angular-prettyprint


ทำงานแล้ว! ฉันมีสตริง json ไม่ใช่วัตถุ json ดังนั้นฉันต้องเพิ่มบรรทัดนี้ก่อนที่จะเรียก JSON.stringify: var jsonObject = JSON.parse (jsonString);
Derek

ไวยากรณ์ที่ไม่คาดคิดฉันคาดว่าการใช้จะเหมือนกับการใช้ไปป์มาตรฐาน <div>{{obj | prettyprint }}</div> แต่มันได้ผล!
Paul Gorbas

1
ดังที่ @ shane-hsu ชี้ให้เห็นมีjsonท่อในตัวดังที่มีใน Angular 1
David Souther

คุณหายไปimplements PipeTransformหลังexport class PrettyPrintPipe
MatthiasSommer

1
เหตุใดจึงไม่ได้รับการยอมรับ ตอบคำถามที่ถามไม่เหมือนกับคำตอบที่ยอมรับ
davejoem

4

เนื่องจากนี่เป็นผลลัพธ์แรกใน Google ขอฉันเพิ่มผลสรุปสั้น ๆ :

  • หากคุณต้องการพิมพ์ JSON โดยไม่มีการจัดรูปแบบที่เหมาะสมjsonไปป์ในตัวที่แนะนำโดย Shane Hsu จะทำงานได้อย่างสมบูรณ์:<pre>{{data | json}}</pre>

  • อย่างไรก็ตามหากคุณต้องการได้ผลลัพธ์ที่แตกต่างออกไปคุณจะต้องสร้างท่อของคุณเองตามที่ Thierry Templier แนะนำ:

    1. ng g generate pipe prettyjson
    2. ใน prettyjson.pipe.ts:
import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'prettyjson'
})
export class PrettyjsonPipe implements PipeTransform {

  transform(value: any, ...args: any[]): any {
    return JSON.stringify(value, null, 2)
    .replace(/ /g, '&nbsp;') // note the usage of `/ /g` instead of `' '` in order to replace all occurences
    .replace(/\n/g, '<br/>'); // same here
  }

}
  1. สุดท้ายและเนื่องจากเราส่งคืนเนื้อหา HTML จึงต้องใช้ไปป์ภายในinnerHTMLฟังก์ชัน:
<div [innerHTML]="data | prettyjson"></div>

0

เนื่องจากตัวแปรของฉันเชื่อมโยงกับ ngModel สองทางฉันจึงไม่สามารถทำได้บน html ฉันใช้ในด้านส่วนประกอบJSON.stringify(displayValue, null, 2) และได้ผล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.