TypeScript服务上的Angular函数未定义或未定义

时间:2015-10-05 22:10:11

标签: angularjs typescript

这是我的服务。

export module cropyear_services {
//export interface ICropYearService {
//    getFieldYearData(): any;

//}
export class CropYearService {    

    static $inject: string[] = ["$q", "$filter", "$httpBackend", "$http"];
    constructor(private _q: ng.IQService, private _http: ng.IHttpService, private _filter: ng.IFilterService, private _$httpMock: ng.IHttpBackendService) { }

    getFieldYearData = function () {

        let deferred = this._q.defer();
        let uri = endpoints.Endpoints.endpoints.fieldyears;
        this._http.get(uri).then((fieldYearResultData: any) => {
            let fieldYearData = fieldYearResultData.data[0].ResultSet;
            deferred.resolve({ result: fieldYearData });
        }).catch(() => {
            deferred.reject();
        });         

        return deferred.promise;
    }

 }
}

这是我的控制器,我正在调用服务方法。

/// <reference path="../../../../thirdparty/lodash/lodash.d.ts"/>
/// <reference path="../../../../thirdparty/angular-material/angular-material.d.ts"/>
 /// <reference path="../../../../thirdparty/angular/angular.d.ts"/>
/// <reference path="../../../../thirdparty/angular-ui-router/api/angular-ui-router.d.ts"/>
/// reference path="./cropyear.service.ts"/>
/// reference path= "../../../../common/sharedData/TSModule/sharedData.ts'/>
import service = require('./cropyear.service');
import SharedDataFactory =    require('../../common/sharedData/TSModule/sharedData'); 

export module cropyear_controllers {
export class CropYearController {
    static $inject: string[] = ["$log", "$scope", "cropYearService"];
    constructor(/*private _log: ng.ILogService,*/ public _scope: ng.IScope,   public _cropYearService:  service.cropyear_services.CropYearService
        , public _sharedData: any, public fieldYears: any) {
        this._sharedData = SharedDataFactory.sharedData_factories.SharedData;
    }
    loadYears() {            
        this._cropYearService.getFieldYearData()
            .then((data: any) => {
                this.fieldYears = _.uniq(_.pluck(data.result, 'CropYear'));
            })
            .catch(() => {
                console.log('Error calling farm view  service');
            });
    }
    hangeCropYear(year: number) {
        this._sharedData.selectCropYear(year);
    }
}
}

Vs编译它没有错误。当我尝试上升loadYears()时,我在控制台中得到Uncaught TypeError错误:this._cropYearService.getFieldYearData不是函数。任何人都可以指出我的错误在哪里?

2 个答案:

答案 0 :(得分:2)

想通了。这是因为$ inject的顺序。

答案 1 :(得分:0)

  

当我尝试上升loadYears()时,我在控制台中得到Uncaught TypeError错误:this._cropYearService.getFieldYearData不是函数

loadYears中this的含义由调用者驱动。由于您还没有分享调用loadYears的方式,因此我怀疑修复是对arrow function的简单更改:

loadYears = () => {            
    this._cropYearService.getFieldYearData()
        .then((data: any) => {
            this.fieldYears = _.uniq(_.pluck(data.result, 'CropYear'));
        })
        .catch(() => {
            console.log('Error calling farm view  service');
        });
}