TypeScript
TypeScript con AngularJS
Ricerca…
Parametri
Nome | Descrizione |
---|---|
controllerAs | è un nome alias, a cui possono essere assegnate variabili o funzioni. @vedi: https://docs.angularjs.org/guide/directive |
$inject | Elenco Iniezione delle dipendenze, è risolto da angolare e passa come argomento alle funzioni del coassuttore. |
Osservazioni
Mentre si fa la direttiva in TypeScript, tenere presente che la potenza di questo linguaggio di tipo personalizzato e le interfacce che è possibile creare. Questo è estremamente utile quando si sviluppano applicazioni enormi. Il completamento del codice supportato da molti IDE ti mostrerà il valore possibile per il tipo corrispondente con cui stai lavorando, quindi c'è molto di più da tenere a mente (confrontandolo con VanillaJS).
"Codice contro interfacce, non implementazioni"
Direttiva
interface IMyDirectiveController { // specify exposed controller methods and properties here getUrl(): string; } class MyDirectiveController implements IMyDirectiveController { // Inner injections, per each directive public static $inject = ["$location", "toaster"]; constructor(private $location: ng.ILocationService, private toaster: any) { // $location and toaster are now properties of the controller } public getUrl(): string { return this.$location.url(); // utilize $location to retrieve the URL } } /* * Outer injections, for run once controll. * For example we have all templates in one value, and we wan't to use it. */ export function myDirective(templatesUrl: ITemplates): ng.IDirective { return { controller: MyDirectiveController, controllerAs: "vm", link: (scope: ng.IScope, element: ng.IAugmentedJQuery, attributes: ng.IAttributes, controller: IMyDirectiveController): void => { let url = controller.getUrl(); element.text("Current URL: " + url); }, replace: true, require: "ngModel", restrict: "A", templateUrl: templatesUrl.myDirective, }; } myDirective.$inject = [ Templates.prototype.slug, ]; // Using slug naming across the projects simplifies change of the directive name myDirective.prototype.slug = "myDirective"; // You can place this in some bootstrap file, or have them at the same file angular.module("myApp"). directive(myDirective.prototype.slug, myDirective);
Semplice esempio
export function myDirective($location: ng.ILocationService): ng.IDirective {
return {
link: (scope: ng.IScope,
element: ng.IAugmentedJQuery,
attributes: ng.IAttributes): void => {
element.text("Current URL: " + $location.url());
},
replace: true,
require: "ngModel",
restrict: "A",
templateUrl: templatesUrl.myDirective,
};
}
// Using slug naming across the projects simplifies change of the directive name
myDirective.prototype.slug = "myDirective";
// You can place this in some bootstrap file, or have them at the same file
angular.module("myApp").
directive(myDirective.prototype.slug, [
Templates.prototype.slug,
myDirective
]);
Componente
Per una transizione più semplice verso Angular 2, si consiglia di utilizzare Component
, disponibile da Angular 1.5.8
myModule.ts
import { MyModuleComponent } from "./components/myModuleComponent";
import { MyModuleService } from "./services/MyModuleService";
angular
.module("myModule", [])
.component("myModuleComponent", new MyModuleComponent())
.service("myModuleService", MyModuleService);
componenti / myModuleComponent.ts
import IComponentOptions = angular.IComponentOptions;
import IControllerConstructor = angular.IControllerConstructor;
import Injectable = angular.Injectable;
import { MyModuleController } from "../controller/MyModuleController";
export class MyModuleComponent implements IComponentOptions {
public templateUrl: string = "./app/myModule/templates/myComponentTemplate.html";
public controller: Injectable<IControllerConstructor> = MyModuleController;
public bindings: {[boundProperty: string]: string} = {};
}
templates / myModuleComponent.html
<div class="my-module-component">
{{$ctrl.someContent}}
</div>
Controller / MyModuleController.ts
import IController = angular.IController;
import { MyModuleService } from "../services/MyModuleService";
export class MyModuleController implements IController {
public static readonly $inject: string[] = ["$element", "myModuleService"];
public someContent: string = "Hello World";
constructor($element: JQuery, private myModuleService: MyModuleService) {
console.log("element", $element);
}
public doSomething(): void {
// implementation..
}
}
servizi / MyModuleService.ts
export class MyModuleService {
public static readonly $inject: string[] = [];
constructor() {
}
public doSomething(): void {
// do something
}
}
somewhere.html
<my-module-component></my-module-component>