Come accedere a un modello diverso in un connettore?

Sono molto vicino, ma non riesco a capire come fare. Ho creato un connettore qui connectors/revision-user-details-after:

Nella mia classe del connettore, posso accedere a args e component tramite il metodo shouldRender, che mi permette di ottenere il nome utente corrente e l’ID del post:

export default {
  shouldRender(args, component) {
    console.log('postAuthor', args.model.username)
    console.log('postId', args.model.id)
  }
};

Vorrei anche ottenere il nome utente dell’utente che ha modificato il post (in questo caso, “nachocab”), ma args.model è un Post, non un PostRevision.

Questo è l’aspetto della finestra di dialogo della cronologia:

https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/templates/modal/history.hbs#L5

E il controller della cronologia:

https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/controllers/history.js#L74

Come posso accedere alla revisione nel connettore?

Ah, ho appena capito che posso farlo!

import Post from "discourse/models/post";

Post.loadRevision(args.model.id, args.model.version).then((result) => {
  const editorUsername = result.username;
  doSomethingElse();
});

AGGIORNAMENTO
@eviltrout Pensavo di aver risolto, ma ho appena capito che, dato che Post.loadRevision restituisce una Promise, non posso inserirlo dentro shouldRender():

import Post from 'discourse/models/post';

export default {
  shouldRender(args, component) {
    // restituire una promise non funziona
    return Post.loadRevision(args.model.id, args.model.version).then((revision) => {
      return args.model.username !== revision.username;
    });
  },
};

C’è un altro modo per farlo?

Potresti spostarlo fuori dal connettore in un nuovo componente da inserire e farlo mostrare uno stato “Caricamento…” finché la promise non viene risolta, momento in cui imposti il valore e lo visualizzi.

Grazie, Robin. Il tuo suggerimento era esattamente quello di cui avevo bisogno. :tada:

Questo funziona, ma mi chiedo se sia necessaria la chiamata ajax diretta (quando ho seguito il percorso del connettore, avevo accesso al Post ma non alla Revisione; ora che ho seguito il percorso del componente, ho accesso alla Revisione ma non al Post :thinking:)

{{! templates/connectors/revision-user-details-after/reply-to-editor.hbs }}
{{reply-to-editor
  postId=model.post_id
  postVersion=model.current_version
  revisionAuthor=model.username
}}
{{! templates/components/reply-to-editor.hbs }}
{{#if isVisible}}
  {{d-button
    action=(action 'replyToEditor')
    label='test'
  }}
{{/if}}
{{! javascripts/discourse/components/reply-to-editor.js.es6 }}
import { ajax } from 'discourse/lib/ajax';

export default Ember.Component.extend({
  isVisible: true,

  didRender() {
    if (!this.get('postId')) return;

    ajax(`/posts/${this.get('postId')}`).then((post) => {
      // mostra il pulsante solo se l'autore della revisione non è l'autore del post
      this.set('isVisible', this.get('revisionAuthor') !== post.username);
    });
  }
});

Non sono sicuro del motivo per cui non hai accesso alle stesse variabili nel template che nel connettore. Dovrebbero essere identiche!