Ako používať angularjs app.service a $q v typescripte
Som úplne nový v TypeScripte a AngularJS. Nedokážem nájsť správnu odpoveď, môj kód je uvedený nižšie:
export class SidenavController {
static $inject = ['$scope', '$mdSidenav'];
constructor(private $scope: any,private $mdSidenav: any) {
}
toggleSidenav(name: string) {
this.$mdSidenav(name).toggle();
}
loadHelpInfo() {
this.helpService.loadAll()
.then(function(help) {
this.$scope.helpInfo = [].concat(help);
this.$scope.selected = this.$scope.helpInfo[0];
})
}
selectHelpInfo(help) {
this.$scope.selected = angular.isNumber(help) ? this.$scope.helpInfo[help] : help;
this.$scope.toggleSidenav('left');
}
}
app.service('helpService', ['$q', function($q) {
var helpInfo = [{
name: 'Introduction',
content: '1 '
}, {
name: 'Glossary',
content: '2'
}, {
name: 'Log In',
content: '3'
}, {
name: 'Home Page',
content: '4'
}];
return {
loadAll: function() {
return $q.when(helpInfo);
}
};
}]);
V horeuvedenom kóde chcem použiť helpService na načítanie detailov na obrazovke. Pri vykonávaní dostávam nasledujúcu chybu: app/components/sidenav/sidenav-controller.ts(10,10): error TS2339: Vlastnosť 'helpService' neexistuje v type 'SidenavController'. Nie som si istý, ako používať služby v TypeScripte. Tiež, ak to bude potrebné, som pripravil verziu Angularu v CodePene:
http://codepen.io/snehav27/pen/JdNvBV
V podstate sa snažím vytvoriť Typescript verziu vyššie uvedeného útržku
Odpoveď č. 1
Musíte injektovať helpservice a nastaviť ho vo vašom konštruktore ako argument.
static $inject = ['$scope', '$mdSidenav', 'helpService'];
constructor(private $scope: any,private $mdSidenav: any, private helpService:any) {
}
inak TypeScript nevie, na čo odkazujete ako this.helpService, aj bez TS to spôsobí chybu, keď sa pokúsite vykonať this.helpService.loadAll s chybou „cannot access loadAll of undefined“ alebo podobnou.
Tiež použite šípkový operátor na vyriešenie lexikálneho rozsahu this @
this.helpService.loadAll()
.then((help) => { //<-- here
this.$scope.helpInfo = [].concat(help);
this.$scope.selected = this.$scope.helpInfo[0];
});
inak to spôsobí ďalšiu chybu, pretože this nebude vo vnútri spätného volania inštancia kontroléra.
Môžete tiež vytvoriť typovanie pre helpService, aby ste ho používali lepšie a znížili možné preklepy.
export interface IHelpService{
loadAll():ng.IPromise<Array<HelpInfo>>; //use specific typing instead of any
}
export interface HelpInfo{
name:string;
content:string;
}
class HelpService implements IHelpService{
private _helpInfo:Array<HelpInfo> = [{
name: 'Introduction',
content: '1 '
}, {
name: 'Glossary',
content: '2'
}, {
name: 'Log In',
content: '3'
}, {
name: 'Home Page',
content: '4'
}];
static $inject = ['$q'];
constructor(private $q:ng.IQService){
}
loadAll(){
return this.$q.when(this._helpInfo);
}
}
angular.module('HelpApp').service('helpService', HelpService);
a
constructor(private $scope: any,private $mdSidenav: any, private helpService:IHelpService) {
Bolo by tiež lepšie používať syntax controller as s definíciou triedy v Typescripte a úplne sa zbaviť pripájania vlastností na scope. To, čo máte teraz, je nedokončené (funkcie pripojené k inštancii controllera a niektoré vlastnosti k scope).
export class SidenavController {
helpInfo:Array<HelpInfo>;
selected:HelpInfo;
static $inject = ['$mdSidenav', 'helpService'];
constructor(private $mdSidenav: any, private helpService:IHelpService) {}
toggleSidenav(name: string) {
this.$mdSidenav(name).toggle();
}
loadHelpInfo() {
this.helpService.loadAll()
.then((help) => {
this.helpInfo = [].concat(help);
this.selected = this.helpInfo[0];
})
}
selectHelpInfo(help) {
this.selected = angular.isNumber(help) ? this.helpInfo[help] : help;
this.toggleSidenav('left');
}
}
a podľa tvojho názoru:
<body layout="column" ng-controller="AppCtrl as vm">
a odkazujte na vlastnosti a metódy s predponou vm (Môžete použiť akýkoľvek alias, ja používam vm). Príklad (mali by ste byť schopní zistiť zvyšok):-
<md-item ng-repeat="it in vm.helpInfo">
<--- some code -->
<md-button ng-click="vm.selectHelpInfo(it)"
ng-class="{'selected' : it === vm.selected }">
