javascript - Legg til tilleggsinformasjon til rute - løsning for TypeScript?
vanligvis legger jeg noen innstillinger inn i ruten min. For eksempel:
.when('Products', {
templateUrl: 'App/Products.html',
settings: {
showbuy: true,
showexport: true,
Description: "Product List"
},[...]
Siden jeg begynte med TypeScript og AngularJS, medfører grensesnittet til IRouteProvider noen begrensninger når det gjelder IRouteProvider for øvrig i forhold til IRoute-grensesnittet. IRoute-grensesnittet gir ingen egenskaper hvor jeg kunne lagre mitt egendefinerte innstillingsobjekt.
Akkurat nå kan jeg bare sette de forhåndsdefinerte egenskapene til IRoute-grensesnittet som:
app.config([
<any>'$routeProvider', function routes($routeProvider: ng.route.IRouteProvider) { $routeProvider
.when('/Product',
{
templateUrl: 'App/Products.html',
controller:'someController'
[...]
})
AngularJS ng-route-grensesnittet er definert som:
interface IRouteProvider extends IServiceProvider {
otherwise(params: IRoute): IRouteProvider;
when(path: string, route: IRoute): IRouteProvider;
}
/**
* see http://docs.angularjs.org/api/ngRoute/provider/$routeProvider#when for API documentation
*/
interface IRoute {
/**
* {(string|function()=}
* Controller fn that should be associated with newly created scope or the name of a registered controller if passed as a string.
*/
controller?: string|Function;
/**
* A controller alias name. If present the controller will be published to scope under the controllerAs name.
*/
controllerAs?: string;
/**
* Undocumented?
*/
name?: string;
[...]
Så jeg spurte meg selv om det finnes en løsning for å lagre et tilpasset objekt til hver definerte rute.
Svar #1
En tilnærming er å definere et nytt grensesnitt som utvider ng.route.IRoute. Når ruten erklæres, kaste rutedefinisjonen som det nye grensesnittet.
Definer et nytt grensesnitt:
export interface IPageTitleRoute extends ng.route.IRoute {
pageTitle: string;
}
Definer rutekasting som det nye grensesnittet:
angular.module('App').config(['$routeProvider',
function routes($routeProvider: ng.route.IRouteProvider) {
$routeProvider
.when('/', <IPageTitleRoute> {
controller: App.Controllers.HomeController,
controllerAs: 'vm',
templateUrl: './views/app/home.html',
pageTitle: 'Home'
})
.otherwise('/');
}
]);
Utnytt den nye egenskapen på passende steder (som $routeChangeSuccess):
angular.module('App').run(['$rootScope', '$location',
function($rootScope: ng.IRootScopeService, $location: ng.ILocationService) {
$rootScope.$on('$routeChangeSuccess',
function(event: ng.IAngularEvent, current: IPageTitleRoute, previous: ng.route.IRoute) {
$rootScope['pageTitle'] = current.pageTitle;
}
);
}
]);
Jeg fant dette svaret på et relatert spørsmål angående casting til et grensesnitt nyttig. Her er et sitat:
Et interface i TypeScript er en konstruksjon som kun eksisterer under kompilering, uten noen representasjon under kjøring. Du kan finne seksjon 7 i TypeScript-spesifikasjonen interessant å lese, da den har alle detaljene.
Svar #2
Du kan legge til vilkårlige medlemmer i et objektliteral, og det vil fortsatt samsvare med grensesnittet. For eksempel kompilerer følgende fint:
interface I {}
var i: I = { a: 1 };
