Um eine bestehende Discourse-Route in einer Theme-Komponente umzuleiten, können Sie api.modifyClass verwenden, um die Route-Klasse zu ändern.
Weitere Informationen finden Sie in der Ember-Dokumentation zur Weiterleitung beim Routing. Hier ist ein Beispiel:
<script type="text/discourse-plugin" version="0.8">
// Die Tag-Route ändern.
api.modifyClass('route:tag-show', {
afterModel: function(tag, transition) {
this._super(tag, transition);
// Wenn es Sonntag ist, zur Topic mit der ID 20 umleiten.
if (today.getDay() == 6) {
this.replaceWith("/t/20");
}
}
}
</script>
Wenn Sie Daten laden müssen, um zu entscheiden, wohin oder ob umgeleitet werden soll, müssen Sie Ihren Route-Hook ein Promise zurückgeben lassen, wie in der Ember-Dokumentation zum asynchronen Routing beschrieben. Hier ist ein Beispiel:
<script type="text/discourse-plugin" version="0.8">
const ajax = require('discourse/lib/ajax').ajax;
api.modifyClass('route:tag-show', {
afterModel: function(tag, transition) {
// Es scheint wichtig zu sein, dass dies zuerst kommt.
this._super(tag, transition);
// Zur ersten offenen Topic umleiten, die sowohl mit dem Route-Tag als auch mit dem 'canonical'-Tag versehen ist.
var path = `/tags/intersection/canonical/${tag.id}.json`;
const context = this;
return ajax(path).then(function(result){
var topics = result.topic_list.topics.filter(function(topic) {
return !topic.closed ;
});
if (topics && topics.length > 0) {
var topic = topics[0];
// Sie müssen den Fall berücksichtigen, in dem das Ziel identisch mit dem Ursprung ist.
// Sie könnten die Transition abbrechen, aber hier erlauben wir, dass sie ohne Umleitung fortgesetzt wird.
if (!transition.from || transition.from.parent.name != 'topic' || transition.from.parent.params.id != topic.id) {
context.replaceWith("/t/" + topic.id);
}
}
})
// Fehler abfangen, damit die (nicht umgeleitete) Route als Fallback fortgesetzt werden kann.
.catch(function() {
console.log('Fehler beim Laden der Topics per Ajax im afterModel-Hook der tag-show-Route.');
});
},
});
</script>