You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular Smart-Table需求:行重复校验与新增行至底部

Hey there! Let's tackle your two Angular Smart-Table requirements one by one— I’ve worked with this component quite a bit, so here’s how you can get these features up and running:

1. Implement Row Uniqueness Validation

First, you need to define what makes a row "unique" (e.g., a specific field like userId, email, or even a combination of fields). Let’s use a userId field as our unique identifier for this example.

Step 1: Validate Before Adding the Row

If you’re using a custom add button or form to create new rows, add a check against your existing table data before pushing the new row:

// Assume your table data is stored in this.tableData
addNewRow(newRow: any) {
  // Check for duplicates based on userId
  const isDuplicate = this.tableData.some(row => row.userId === newRow.userId);

  if (isDuplicate) {
    // Show a user-friendly error (use Angular Material Snackbar, Toastr, or a simple alert)
    alert('This row already exists! Please verify your input.');
    return;
  }

  // Proceed to add the row (we’ll handle the position next)
  this.addRowToBottom(newRow);
}

Step 2: Real-Time Validation (Optional)

If you’re using an Angular Reactive Form for the new row input, add a custom validator to check for duplicates as the user types:

import { FormBuilder, Validators, AbstractControl, ValidationErrors } from '@angular/forms';

// Initialize your form in ngOnInit or constructor
this.newRowForm = this.fb.group({
  userId: ['', [Validators.required, this.uniqueUserIdValidator.bind(this)]]
});

// Custom validator function
uniqueUserIdValidator(control: AbstractControl): ValidationErrors | null {
  const userId = control.value;
  if (!userId) return null;

  const isDuplicate = this.tableData.some(row => row.userId === userId);
  return isDuplicate ? { duplicateUserId: true } : null;
}

Then display the error in your template:

<mat-form-field>
  <input matInput formControlName="userId" placeholder="User ID">
  <mat-error *ngIf="newRowForm.get('userId')?.hasError('duplicateUserId')">
    This User ID is already in the table!
  </mat-error>
</mat-form-field>

2. Add New Rows to the Table Bottom

By default, many Smart-Table implementations add rows to the top using unshift()— switching to push() will put new rows at the bottom instead.

Option 1: Custom Add Button/Form

If you’re handling row addition manually, just use push() on your data array:

addRowToBottom(newRow: any) {
  this.tableData.push(newRow);
  // If using a LocalDataSource, refresh it to update the table
  this.source.load([...this.tableData]);
}

Option 2: Using Smart-Table’s Built-In Create Feature

If you’re using the component’s native create action (with the built-in add button), override the createConfirm event to control where the row is added:

First, configure your Smart-Table settings to enable confirm on create:

settings = {
  add: {
    confirmCreate: true, // Triggers the createConfirm event when user confirms
    addButtonContent: 'Add Row',
    createButtonContent: 'Save',
    cancelButtonContent: 'Cancel'
  },
  // ... other column/table settings ...
};

Then handle the event in your component:

onCreateConfirm(event: any) {
  // First run uniqueness validation
  const isDuplicate = this.tableData.some(row => row.userId === event.newData.userId);

  if (isDuplicate) {
    alert('Duplicate row detected!');
    event.confirm.reject(); // Reject the create action
    return;
  }

  // Add the new row to the bottom of the data array
  this.tableData.push(event.newData);
  event.confirm.resolve(); // Resolve to refresh the table
  // Or explicitly reload the data source if needed
  this.source.load(this.tableData);
}

And bind the event in your template:

<ng2-smart-table 
  [settings]="settings" 
  [source]="source" 
  (createConfirm)="onCreateConfirm($event)">
</ng2-smart-table>

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:32:47