You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用ng2-smart-table展示API数据?代码是否有误?

解决ng2-smart-table展示API数据的问题

我来帮你梳理代码里的问题,然后一步步实现从API获取数据并在ng2-smart-table中展示的功能:

一、你的代码存在的几个关键问题

  • Service层设计不合理getAllClients方法直接在内部订阅了HTTP请求,导致组件无法获取异步返回的数据,也没法在组件层面处理错误提示;
  • API地址拼写错误url="http://localhost:21063/api/clints"里的clints应该是clients(和你的模型、服务命名保持一致);
  • 数据未绑定:组件里的data是硬编码的空模板数组,没有和从API获取的客户数据关联;
  • index列未自定义:你的Clients模型里没有index字段,需要配置ng2-smart-table的自定义渲染逻辑来生成序号。

二、修改后的完整代码

1. 修正ClientsService

把HTTP请求的订阅逻辑移到组件中,Service只负责返回Observable,这样组件可以灵活处理数据和错误:

import { Injectable } from '@angular/core';
import { Clients } from './clients.model';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class ClientsService {
  // 修正API地址拼写错误
  url="http://localhost:21063/api/clients"

  constructor(private http:HttpClient) { }

  // 返回Observable,让组件自行订阅处理
  getAllClients(): Observable<Clients[]> {
    return this.http.get<Clients[]>(this.url);
  }
}

2. 修正ClientInfoComponent

在组件中订阅Service的方法,将获取到的数据赋值给data,同时配置index列的自定义渲染:

import { Clients } from './../clients.model';
import { Component, OnInit } from '@angular/core';
import { IAngularMyDpOptions, IMyDateModel } from 'angular-mydatepicker';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { ClientsService } from '../clients.service';

@Component({
  selector: 'app-client-info',
  templateUrl: './client-info.component.html',
  styleUrls: ['./client-info.component.css']
})
export class ClientInfoComponent implements OnInit {
  settMain = {
    noDataMessage: 'عفوا لا توجد بيانات',
    actions: {
      columnTitle: 'إجراءات',
      position: 'right',
    },
    pager: {
      perPage: 25,
    },
    add: {
      addButtonContent: ' إضافة جديد ',
      createButtonContent: '',
      cancelButtonContent: '',
    },
    edit: {
      editButtonContent: '',
      saveButtonContent: '',
      cancelButtonContent: '',
    },
    delete: {
      deleteButtonContent: '',
    },
    columns: {
      index: {
        title: 'مسلسل',
        width: '80px',
        // 自定义序号列,返回当前行的索引+1
        valuePrepareFunction: (cell, row, index) => {
          return index + 1;
        }
      },
      id: {
        title: 'كود العميل',
        width: '80px',
      },
      name: {
        title: 'اسم العميل',
        width: '160px'
      },
      phone: {
        title: ' الهاتف'
      },
      address: {
        title: ' العنوان'
      },
      nots: {
        title: 'ملاحظات'
      }
    }
  };

  // 初始化空数组,后续接收API返回的数据
  data: Clients[] = [];
  private myForm: FormGroup;

  constructor(private formBuilder: FormBuilder, private service: ClientsService) { }

  ngOnInit() {
    // 订阅Service的方法,获取并处理数据
    this.service.getAllClients().subscribe(
      (response) => {
        this.data = response;
        console.log('获取到的客户数据:', this.data);
      },
      (err: HttpErrorResponse) => {
        if (err.error instanceof Error) {
          console.log("客户端错误:", err.message);
          // 这里可以添加用户友好的错误提示,比如Toast组件
        } else {
          console.log("服务器错误:", err.status, err.message);
          // 同样可以添加用户提示
        }
      }
    );
  }
}

3. 在HTML模板中配置ng2-smart-table

确保你的client-info.component.html中添加ng2-smart-table标签,绑定settings和数据源:

<ng2-smart-table [settings]="settMain" [source]="data"></ng2-smart-table>

三、额外注意事项

  • 确认你已经在对应的模块(比如AppModule)中导入了Ng2SmartTableModule,否则组件无法识别ng2-smart-table标签:
import { Ng2SmartTableModule } from 'ng2-smart-table';

@NgModule({
  imports: [
    // ...其他已导入的模块
    Ng2SmartTableModule
  ]
})
export class AppModule { }
  • 检查API接口是否正常:可以通过浏览器的Network面板查看请求是否成功,返回的数据结构是否和Clients模型的字段完全匹配(字段名、数据类型都要对应)

内容的提问来源于stack exchange,提问作者Mohamed Elkast

火山引擎 最新活动