Giter VIP home page Giter VIP logo

Comments (8)

JoostK avatar JoostK commented on May 14, 2024

This is working as designed; the trackBy function is not allowed to change, so cannot originate from a template variable.

from angular.

zip-fa avatar zip-fa commented on May 14, 2024

So i modified my code to actually change trackBy with setInterval, and it still works:

type TestType = {
  id: number;
  name: string;
};

@Component({
  selector: 'app-root',
  standalone: true,
  template: `
    Current trackBy: {{ trackByNonSignal }}

    <!-- THIS WORKS -->
    @for(item of data; track item[trackByNonSignal]) {
      <p>
      #{{ item.id }} &mdash; {{ item.name }}
      </p>
    }

    <!-- @if(trackBy(); as trackBySignal) {
      @for(item of data; track item[trackBySignal]) {
        <p>
        #{{ item.id }} &mdash; {{ item.name }}
        </p>
      }
    } -->
  `,
})
export class App {
  public data = [
    { id: 123, name: 'test' },
    { id: 456, name: 'test2' },
  ];

  public trackByNonSignal: keyof TestType = 'id';
  public trackBy = signal<keyof TestType>('id');

  constructor() {
    let tick = 0;

    setInterval(() => {
      this.trackByNonSignal = tick % 2 === 0 ? 'id' : 'name';
      tick++;
    }, 1000);
  }
}

Example on stackblitz updated too. Take a look @JoostK

from angular.

JoostK avatar JoostK commented on May 14, 2024

While that doesn't report any errors, it results in unstable identities which for does not account for.

from angular.

zip-fa avatar zip-fa commented on May 14, 2024

I didn't want to change trackBy dynamically, that's not my initial idea.
Maybe allow devs to put something to trackBy from template-variable, and throw an error when its value changes?

from angular.

JoostK avatar JoostK commented on May 14, 2024

We decided not to support referencing template variables because it results in runtime overhead, as it requires dynamic lookup during change detection.

It is unclear to me what you are trying to achieve, if it isn't for changing the value dynamically.

from angular.

zip-fa avatar zip-fa commented on May 14, 2024

I am building universal table, which loads data from server.
Since this table supports different entities with different columns, i must put inside trackBy an existing key from entity.
The only solutions for now:

  1. use $index, but perforance will go down with table-sorting etc
  2. use class variable, but cmon, why do i have to make proxy-variable?

Example entity interfaces:

type Entity1 = {id: 123};
type Entity2 = {uuid: 'sdf-sdf-sdf'};

type RepeatableResponse<T> = {
results: T[];
primaryKey: string;
pagination: ...;
}

Pseudocode:

ts:

@Input()
set endpoint(endpoint: string) {
this.apiPath.set(endpoint);
}

public response = toSignal(this.responseObs);

private responseObs = computed<Observable<RepetableResponse<T>>>(() => {
return this.someService.getResults(this.apiPath());
});

html:

@if(response(); as response) {
<table>
<tbody>
@for(result of response.results; trackBy[response.primaryKey]) {
...
}
</tbody>
</table>
}

from angular.

JoostK avatar JoostK commented on May 14, 2024

I see. Yes, that would require referencing a component member.

from angular.

angular-automatic-lock-bot avatar angular-automatic-lock-bot commented on May 14, 2024

This issue has been automatically locked due to inactivity.
Please file a new issue if you are encountering a similar or related problem.

Read more about our automatic conversation locking policy.

This action has been performed automatically by a bot.

from angular.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.