Ich muss eine "aktive" Klasse auf eine Bootstrap-Registerkarte abhängig vom aktuellen Routennamen anwenden. Das Routenobjekt enthält "routeName", aber wie kann ich von einem Controller oder einer Komponente darauf zugreifen?Zugriff auf den aktuellen Routennamen von einer Steuerung oder Komponente aus
Antwort
für Ember 2, von einem Controller führen Sie ausprobieren können:
appController: Ember.inject.controller('application'),
currentRouteName: Ember.computed.reads('appController.currentRouteName')
Dann können Sie es an die Komponente übergeben.
Im absolut verzweifelten Fall können Sie den Router oder den Anwendungscontroller (der die Eigenschaft 'currentRouteName' freigibt) über this.container.lookup("router:main")
oder this.container.lookup("controller:application")
von der Komponente aus nachschlagen.
Wenn es ein allgemeiner Trend für mich war, würde ich einen CurrentRouteService machen und ihn in meine Komponente (n) injizieren, so dass ich in meinen Tests die Dinge leichter verhöhnen kann.
Es kann auch eine bessere Antwort geben - aber der container.lookup() sollte Ihren aktuellen Blocker umwerfen.
Es gibt undefined für mich zurück: 'this.container.lookup (" router: main ").get ('currentRouteName') ' – jax
verwenden this.controllerFor('application').get('currentRouteName');
Funktioniert das von einer Komponente? – Huafu
@Huafu Es sollte in Ember 1 funktionieren. Ich bin mir über Glut 2 nicht sicher. Ich habe seit einiger Zeit nicht mehr in Glut gearbeitet. Aber ich denke, es wird nicht mehr, seit Controller ersetzt werden, zugunsten von routingfähigen Komponenten in Ember 2. Ich bin nicht einmal sicher, dass sie sich in diese Richtung bewegt haben. Aber es wäre toll, wenn du hier updaten könntest, wenn du eine Alternative findest. – blessenm
Nein, ich meinte, 'controllerFor' ist eine öffentliche Methode von' Ember.Route', in Ember2 ist es auch eine private statische Methode von 'Ember', aber ich denke nicht, dass es eine Methode von' Ember.Component ist ', sogar privat. Mit anderen Worten, dies würde von einer Route, aber nicht von einer Komponente funktionieren, da "ControllerFor" dort nicht verfügbar ist. – Huafu
bereits.
export default Ember.Route.extend({
routeName: null,
beforeModel(transition){
//alert(JSON.stringify(transition.targetName) + 'typeof' + typeof transition.targetName);
this.set('routeName', transition.targetName);
},
model(){
// write your logic here to determine which one to set 'active' or pass the routeName to controller or component
}
`
In der Tat, müssen Sie nicht selbst aktiv Klasse anzuwenden. Ein link-to
Helfer wird es für Sie tun.
Siehe here:
{{link-to}}
wird einen CSS-Klasse Namen ‚aktiv‘ gelten, wenn die aktuelle Route mit der mitgelieferten Route entspricht der Anwendung. Wenn zum Beispiel die aktuelle Route der Anwendung ist 'photoGallery.recent' die folgende Verwendung von{{link-to}}
:
{{#link-to 'photoGallery.recent'}}
Great Hamster Photos
{{/link-to}}
in
<a href="/hamster-photos/this-week" class="active">
Great Hamster Photos
</a>
Eine so große Verwendung von 'link-to'! –
Mit den Erkenntnissen von @ maharaja-santhirs Antwort kann man sich vorstellen, die Eigenschaft routeName auf dem Ziel-Controller zu setzen, der beispielsweise in der Vorlage des Ziels verwendet werden soll. Auf diese Weise ist es nicht erforderlich, die Logik an mehreren Standorten zu definieren und damit die Wiederverwendbarkeit von Code zu gewährleisten. Hier ist ein Beispiel dafür, wie das erreichen:
// app/routes/application.js
export default Ember.Route.extend({
...
actions: {
willTransition(transition) {
let targetController = this.controllerFor(transition.targetName);
set(targetController, 'currentRouteName', transition.targetName);
return true;
}
}
});
Definition diese willTransition
Aktion in der Anwendung Route ermöglicht Ausbreiten den aktuellen Routennamen überall in der Anwendung. Beachten Sie, dass der Zielcontroller die Eigenschaftseinstellung currentRouteName
behält, auch wenn er zu einer anderen Route navigiert. Dies erfordert bei Bedarf eine manuelle Bereinigung, die je nach Implementierung und Anwendungsfall jedoch akzeptabel sein kann.
- 1. Zugriff auf den Status von der untergeordneten Komponente aus möglich
- 2. Wie bekomme ich den Routennamen von RouteData?
- 3. Zugriff auf den aktuellen Zeilenwert mit Verzögerungsfunktion
- 4. Android - Zuverlässiger Zugriff auf den aktuellen Standort
- 5. Zugriff auf die Steuerung einer Seite von einer anderen Seite
- 6. Wie erhält man den aktuellen Routennamen in Laravel 5?
- 7. Wie Fabrik für den Zugriff auf von der Steuerung
- 8. Zugriff auf "Selektor" aus einer Angular 2-Komponente
- 9. EmberJS: Zugriff auf Komponente html aus der Komponente js
- 10. Zugriff auf eine Master-Seite Steuerung von einer separaten Klasse
- 11. So greifen Sie von einer anderen Komponente aus auf den Status einer Komponente zu
- 12. Angular2 Zugriff Variablen von einer anderen Komponente
- 13. Zugriff auf den Rohteil einer PUT- oder POST-Anforderung
- 14. Zugriff auf den aktuellen Standort im Reducer (Redux-Router)?
- 15. Reagieren: Zugriff Komponente Funktion von einer anderen Komponente
- 16. Zugriff auf den aktuellen HttpContext von einem ILogger
- 17. Zugriff auf die übergeordnete Komponente
- 18. Zugriff auf untergeordnete Komponente von übergeordneter Komponente in reactjs
- 19. Laravel Routennamen mit Parametern auf einer Ressource
- 20. Zugriff auf den aktuellen Benutzer auf ExpressJs - Passport
- 21. Zugriff auf Komponente von DOM-Element
- 22. Zugriff auf den aktuellen HttpContext in ASP.NET Core
- 23. Laravel Routennamen erhält von bestimmten URL
- 24. Symfony2 Zugriff auf Routenvariablen
- 25. Zugriff auf aktuelle Instanz von Page aus einer statischen Klasse
- 26. Wie kann ich auf den Controller einer verschachtelten Komponente von der übergeordneten Komponente zugreifen?
- 27. Zugriff auf die Navigationsleiste aus einer Containeransicht
- 28. Zugriff auf Eltern-HTML-Element von Komponente?
- 29. Zugreifen auf Komponenten aus einer anderen Komponente
- 30. Angular2 @ angular/router 3.0.0-alpha.3 - So erhalten Sie den Routennamen oder Pfad bei einer Routenänderung
Möge dies this.controllerFor ('application'). Get ('currentRouteName') – blessenm
@blesmenm yep, das ist ziemlich genau das, was ich will – jax
ember wird dies für Sie tun. benutze einfach link-to auf deinen Tabs – killebytes