Wie greife ich in einem Connector auf ein anderes Modell zu?

Ich bin schon fast so weit, aber ich komme nicht weiter. Ich habe hier einen Connector erstellt connectors/revision-user-details-after:

In meiner Connector-Klasse kann ich über die Methode shouldRender auf args und component zugreifen, was mir den aktuellen Benutzernamen und die Post-ID liefert:

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

Ich möchte jedoch auch den Benutzernamen des Nutzers erhalten, der den Beitrag bearbeitet hat (in diesem Fall „nachocab“), aber args.model ist ein Post und keine PostRevision.

So sieht der Verlauf-Modal aus:

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

Und der Verlauf-Controller:

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

Wie kann ich im Connector auf die Revision zugreifen?

Ah, mir ist gerade aufgefallen, dass ich das machen kann!

import Post from "discourse/models/post";

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

UPDATE
@eviltrout Ich dachte, ich hätte das schon geklärt, aber mir ist gerade aufgefallen, dass ich Post.loadRevision, da es ein Promise zurückgibt, nicht in shouldRender() einbetten kann:

import Post from 'discourse/models/post';

export default {
  shouldRender(args, component) {
    // Das Zurückgeben eines Promises funktioniert nicht
    return Post.loadRevision(args.model.id, args.model.version).then((revision) => {
      return args.model.username !== revision.username;
    });
  },
};

Gibt es eine andere Möglichkeit, dies zu lösen?

Sie könnten es aus dem Connector in eine neue Komponente auslagern, die Sie einfügen, und einen “Laden…”-Zustand anzeigen lassen, bis der Promise erfüllt ist. Sobald dies der Fall ist, setzen Sie den Wert mit set und zeigen ihn an.

Danke, Robin. Dein Tipp war genau das, was ich brauchte. :tada:

Das funktioniert, aber ich frage mich, ob der direkte ajax-Aufruf notwendig ist (als ich den Connector-Pfad gewählt habe, hatte ich Zugriff auf den Post, aber nicht auf die Revision; jetzt, wo ich den Component-Pfad gewählt habe, habe ich Zugriff auf die Revision, aber nicht auf den 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) => {
      // zeige den Button nur, wenn der Autor der Revision nicht der Autor des Posts ist
      this.set('isVisible', this.get('revisionAuthor') !== post.username);
    });
  }
});

Ich bin mir nicht sicher, warum du im Template nicht auf dieselben Variablen zugreifen kannst wie im Connector. Das sollte identisch sein!