Пользовательское отображение файла JSON в угловых 6 из проекта рельсы API - PullRequest
0 голосов
/ 05 июля 2018

Я новичок в Angular, и у меня возникла проблема с данными карты из моего приложения Rails в приложение Angular. Я знаю, что мне нужно внести некоторые изменения в код, но я не знаю, как это сделать. Я хочу упомянуть, что я использую Rails 5.2 и Active Model Serializer для запроса json.

В моем приложении rails есть модели курса, сегмента, викторины, видео, а отношения:

  1. В курсе было много сегментов
  2. Сегменты могут быть викториной или видео, и я использую STI, поэтому викторины и видео находятся в таблице сегментов

Это файл json, который я получаю из приложения rails, и я хочу отобразить:

[
   {
      "id":1,
      "title":"Introduction",
      "author":"Dana Inbar",
      "segments":[
         {
            "id":1,
            "name":"Intro01",
            "data":"http://www.video.com/1/1"
         },
         {
            "id":2,
            "name":"Intro02",
            "data":"http://www.video.com/1/2"
         },
         {
            "id":3,
            "name":"Intro03",
            "data":"[
            {
                    "question 1" : "___",
                    "answers" : {
                                   "1" : "____",
                                   "2" : "____",
                                   "3" : "____"
                                 },
                    "correct_answer" : "2"
            },
            ]"  
         }
      ]
   },
   {
      "id":2,
      "title":"Master the ELN",
      "author":"Dana Inbar",
      "segments":[

      ]
   },
   {
      "id":3,
      "title":"Master the Inventory",
      "author":"Dana Inbar",
      "segments":[

      ]
   }
]

Это мои угловые файлы:

app.module

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { RouterModule, Routes } from '@angular/router';
import { FormsModule } from '@angular/forms';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { CourseModule } from './courses/course.module';
import { CourseService } from './courses/course.service';

@NgModule({
  declarations: [
    AppComponent
  ],

  imports: [
    BrowserModule,
    HttpClientModule,
    AppRoutingModule,
    CourseModule,
    FormsModule
  ],

  providers: [CourseService],
  bootstrap: [AppComponent]
})
export class AppModule { }

курсы / курс

export interface IQuiz {}

export interface IVideo {}

export interface ISegment {
  segment_id: string;
  name: string;
  type: string;
  data: string;
}

export interface ICourse {
  course_id: number;
  title: string;
  autor: string;
  
  segments: {
      [segment_id: string]: ISegment,
      [name: string]: ISegment,
      [type: string]: ISegment,
      [data: string]: ISegment
  }
}

курсы / course.service

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

import { Observable, throwError } from 'rxjs';
import { map, tap, catchError } from 'rxjs/operators';

import { ICourse } from './course';

// Inject Data from Rails app to Angular app
@Injectable()
export class CourseService{
  private courseUrl = 'http://localhost:3000/courses.json';

  constructor(private http: HttpClient) {  }

  // Get Courses from Rails API App
  getCourses(): Observable<ICourse[]> {
    return this.http.get<ICourse[]>(this.courseUrl)
      .map((res: Response) => res.json()data)
      .catch(this.handleError);
  }

  // Handle Any Kind of Errors
  private handleError(error: Response) {
    console.error(error);
    return Observable.throw(error.json().error || 'Server Error');
  }
}

курсы / course.module

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule, Routes } from '@angular/router';
import { MatSidenavModule } from '@angular/material/sidenav';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

import { CourseListComponent } from './course-list/course-list.component';
import { CourseDetailComponent } from './course-detail/course-detail.component';
import { CourseService } from './course.service';
import { CoursePlayComponent } from './course-play/course-play.component';

const coursesRoutes: Routes = [
  { path: 'courses', component: CourseListComponent },
  { path: 'courses/:id', component: CourseDetailComponent },
  { path: 'courses/:id/1', component: CoursePlayComponent }
]

@NgModule({
  imports: [
    CommonModule,
    MatSidenavModule,
    BrowserAnimationsModule,
    RouterModule.forChild(
      coursesRoutes
    )
  ],
  declarations: [
    CourseListComponent,
    CourseDetailComponent,
    CoursePlayComponent
  ],
  providers: [
    CourseService
  ]
})
export class CourseModule { }

курсы / курс-лист / курс-list.component

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';

import { ICourse } from '../course';
import { CourseService } from '../course.service';

@Component({
  selector: 'lg-course-list',
  templateUrl: './course-list.component.html',
  styleUrls: ['./course-list.component.sass']
})

export class CourseListComponent implements OnInit {
  pageTitle = "LabGuru Academy";
  courses: ICourse[] =[];
  errorMessage: string;

  constructor(private courseService: CourseService) { }

  ngOnInit() {
    this.courseService.getCourses()
      .subscribe(
        courses => this.courses = courses,
        errorMessage => this.errorMessage = <any>error
      );
  }

}

курсы / курс-лист / курс-list.html

<div class="row mt-3 no-gutters">
    <div class="col-lg-8">
      <img src="./assets/images/lg-purple.png" class="d-inline-block align-top" alt="">
    </div>
  </div>

  <div class="jumbotron">
    <div class="container text-center">
      <h1>{{pageTitle}}</h1>
    </div>
  </div>

  <div class="container-fluid bg-3 text-center">
    <div class="row justify-content-lg-center">
      <div class="col-sm-3" *ngFor="let course of courses | async">
        <div class="card">
          <div class="card-body">
            <h3 class="card-title">{{course.title}}</h3>
            <p class="card-text"><small class="text-muted">6 Lessons</small></p>
          </div>
        </div>
      </div>
    </div>
  </div>
  <br><br>

курсы / курс-лист / курс-list.sass

$pos: 70px
$color: #5c0099
$bg-col:  #FFFFFF
$hig: 15rem
$wid: 15rem
$left: 5%
$top: 30%
$right: 7%

.jumbotron
  background-color: transparent
  color: $color

.col-sm-3
  position: relative
  min-height: 1px
  padding-left: $left
  outline-offset: none

.card
    border-color: $color
    background-color: $bg-col
    width: $wid
    height: $hig

.card-title
    position: absolute
    text-align: center
    padding: inherit

.card-text
    position: absolute
    bottom: $left
    right: $right
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...