Angularjs和Typescript服务

安德里亚·蒂尔格瓦图(Andreea Tirgovatu)

我有一个读取json文件的$ http服务。我想使用模块化,但是我不知道如何在控制器中调用服务,也不知道服务的编写是否正确。

这是一个jsFidlle:https ://jsfiddle.net/aqbmdrvn/

谢谢!!!

/// <reference path="../../typings/angularjs/angular.d.ts" />
/// <reference path="../../typings/angularjs/angular-route.d.ts" />
/// <reference path="../app.ts" />  
/// <reference path="servicePets.ts" />
"use strict";

module AnimalPlanet {
    // pet interface
    export interface IPet {
        type: string;
        name: string;
        age: number;
        color: string;
        specialCare: boolean;
        availableForAdoption: boolean;
        ldAdoption: boolean;
        history: string;
        featured: boolean;
        newest: boolean;
        imageUrl: string;
    }

    export interface RootObject {
        pets: IPet[];
    }
    // pet controller with ui-grid
    export class petsCtrl implements RootObject {
        pets: IPet[];
        constructor(private $http: ng.IHttpService,public petsService,  private $scope: any, uiGridConstants: any, filterldAdoption: any) {
            $scope.pets = {};
            // ui grid option
            $scope.gridOptions = {
                enableSorting: true,
                enableFiltering: true,
                paginationPageSizes: [5, 10, 15],
                paginationPageSize: 5,
                onRegisterApi: (gridApi) => {
                    $scope.gridApi = gridApi;
                },
                columnDefs: [
                    {
                        name: 'type',
                        cellTooltip: true,
                        headerTooltip: true
                    },
                    {
                        name: 'name',
                        cellTooltip: true,
                        headerTooltip: true
                    },

                    {
                        name: 'age',
                        // filters: [{
                        //     condition: uiGridConstants.filter.GREATER_THAN,
                        //     placeholder: 'greater than'
                        // }, {
                        //         condition: uiGridConstants.filter.LESS_THAN,
                        //         placeholder: 'less than'
                        //     }
                        // ],
                        cellTooltip: true,
                        headerTooltip: true
                    },
                    {
                        name: 'color',
                        cellTooltip: true,
                        headerTooltip: true

                    },
                    {
                        name: 'specialCare',
                        cellTooltip: true,
                        headerTooltip: true
                    },
                    {
                        name: 'availableForAdoption',
                        cellTooltip: true,
                        headerTooltip: true
                    },
                    {
                        name: 'history',
                        cellTooltip: true,
                        headerTooltip: true
                    },
                    {
                        name: 'featured',
                        cellTooltip: true,
                        headerTooltip: true
                    },
                    {
                        name: 'newest',
                        cellTooltip: true,
                        headerTooltip: true
                    },
                    {
                        name: 'imageUrl',
                        cellTooltip: true,
                        headerTooltip: true,
                        enableFiltering: false,
                        enableHiding: false,
                        cellTemplate: "<img width=\"50px\" ng-src=\"{{grid.getCellValue(row, col)}}\" lazy-src>"
                    }
                ]
            };
            // read json using http service
            this.$http.get('/app/pets/pets.json').success((data) => { // pune te rog asta intr-un serviciu

                // fill ui grid using http service
                $scope.filterPets = data;
                var uiGridPets = [];
                angular.forEach($scope.filterPets, (item) => {
                    if (item.ldAdoption) {
                        uiGridPets.push(item);
                    }
                });

                $scope.gridOptions.data = uiGridPets;

                // filter for main page with 3 pets
                $scope.pets = data;
                $scope.quantity = 3;
                var featuredPets = [];
                var newestPets =[];
                angular.forEach($scope.pets, (item) => {
                    if (item.featured) {

                        featuredPets.push(item);

                    }
                    if(item.newest){
                        newestPets.push(item);
                    }

                });
                $scope.featuredPets = featuredPets;
                $scope.newestPets = newestPets;
           });
            $scope.fromService = petsService.weatherChange();
        }

    }

    petsCtrl.$inject = ['$http', '$scope', 'uiGridConstants', 'petsService'];
    app.controller("petsCtrl", petsCtrl);


}
/// <reference path="../../typings/angularjs/angular.d.ts" />
/// <reference path="../../typings/angularjs/angular-route.d.ts" />
/// <reference path="../app.ts" />  

"use strict";

module AnimalPlanet {
    export interface IPetsService {
        http: ng.IHttpService;
        uiGridConstants: any;
    }
    export class servicePets implements IPetsService {
       http: ng.IHttpService;
       uiGridConstants: any;
        constructor( $scope:any , $http: ng.IHttpService, uiGridConstants: any )
        {
             // read json using http service
            $scope.pets = {};
            this.http = $http;
        }
        public get() {
            this.http.get('/app/pets/pets.json').success((data) => { // pune te rog asta intr-un serviciu

                // fill ui grid using http service
                var filterPets = data;
                var uiGridPets = [];
                angular.forEach(filterPets, (item) => {
                    if (item.ldAdoption) {
                        uiGridPets.push(item);
                    }
                });

                var gridOptions.data = uiGridPets;

                // filter for main page with 3 pets
                var pets = data;

                var quantity = 3;
                var featuredPets = [];
                var newestPets =[];
                angular.forEach(pets, (item) => {
                    if (item.featured) {

                        featuredPets.push(item);

                    }
                    if(item.newest){
                        newestPets.push(item);
                    }

                });
                var featuredPets = featuredPets;
                var newestPets = newestPets;
            });
    }

    }

    servicePets.$inject = ['$http', '$scope', 'uiGridConstants'];
    app.service('servicePets', servicePets);

}
阿维亚德·P。

这是我用于样板控制器和工厂的内容:

控制器代码:

declare var app: angular.IModule;

class MyController {
    static $inject = ['myService'];

    localData: IGetDataResult;

    constructor(private myService: MyService) {
        this.myService.getData('key1')
            .then(result => {
                this.localData = result.data;
            });
    }
}

app.controller('myController', MyController);

工厂代码:

declare var app: angular.IModule;

interface IGetDataResult {
    field1: string;
}

class MyService {
    static $inject = ['$http'];

    constructor(private $http: angular.IHttpService) {
    }

    getData(key: string): angular.IHttpPromise<IGetDataResult> {
        return this.$http({
            method: 'POST',
            data: {
                key: key
            },
            url: '/WebService/GetData'
        });
    }
}

function MyServiceFactory($rootElement) : MyService {
    const inj = $rootElement.injector();
    return inj.instantiate(MyService);
}
app.factory('myService', ['$rootElement', $rootElement => MyServiceFactory($rootElement)]);

一些解释:

  • 控制器非常简单,但是请注意静态注入变量的用法$inject该数组中元素的顺序必须与构造函数中参数的顺序相对应。
  • 我的工厂由工厂功能实例化(对双关语)。请注意,我正在注入对的依赖$rootElement我发现,如果我想使用$location,必须使用实例化的注射器$rootElement
  • 我在$http调用中使用了强类型的返回值由于明显的原因,这很有帮助。
  • 请注意,除之外,所有内容都必须输入$rootElement没有angular.d.ts包含该injector()函数的匹配类型

还有一件事,打字稿适用于该controllerAs方法。这意味着您不需要注入$scope到控制器中,并且在html中,必须controllerAs在每个作用域表达式之前添加控制器别名(值)。这样,您就可以将所有范围变量和函数作为成员放在控制器上。

有时,$scope如果您想使用$watch$on确实需要注入,但是关于this闭包,有一些陷阱,但这是另一篇文章的主题。

一个陷阱ui-grid是,如果您为gridoptions.data成员使用字符串值,则它还必须包含控制器别名前缀。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

AngularJS和Typescript-注入服务

来自分类Dev

AngularJS和Typescript-注入其他服务的服务未定义

来自分类Dev

承诺与angularJS和Typescript

来自分类Dev

Angularjs 1.x和Typescript并将值发布到服务器

来自分类Dev

AngularJS和Jasmine:模拟服务

来自分类Dev

AngularJS扩展服务和继承

来自分类Dev

如何更改AngularJS服务以使用Typescript?

来自分类Dev

AngularJS,Typescript通过服务传递变量

来自分类Dev

单元测试AngularJS和PouchDB服务

来自分类Dev

AngularJs全球消息服务和认证

来自分类Dev

angularjs 1和茉莉,服务承诺测试

来自分类Dev

AngularJS和Web服务交互最佳实践

来自分类Dev

angularjs过滤'date'和$ locale服务

来自分类Dev

AngularJS ng点击服务和承诺

来自分类Dev

AngularJS和PouchDB服务的单元测试

来自分类Dev

仍然对angularjs服务和工厂感到困惑

来自分类Dev

angularjs $编译服务和ng-repeat

来自分类Dev

Angularjs和Laravel服务不是调用吗?

来自分类Dev

AngularJS $ stateProvider和单例服务问题

来自分类Dev

angularjs 模式服务广播和问题

来自分类Dev

AngularJS和Typescript与app.js

来自分类Dev

Angularjs和Typescript-呼叫工厂

来自分类Dev

无法向控制器angularJs + CordovaJs(TypeScript)注入服务

来自分类Dev

AngularJS / TypeScript:由于服务而无法实例化模块

来自分类Dev

简单的TypeScript构造函数变量解释为服务(带有TypeScript的AngularJS)

来自分类Dev

TypeScript和自定义React Hook Api服务

来自分类Dev

哪个服务可以转换AngularJS中的元素和属性名称?

来自分类Dev

AngularJS和PHP使用不同的服务器吗?

来自分类Dev

AngularJS中的单元测试-模拟服务和承诺