2015-10-05 151 views
0

這是我的服務。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不是函數。任何人都可以指出我的錯誤在哪裏?

+0

getFieldYearData = function(),應該是getFieldYearData:function() – Fals

+0

我曾嘗試過,編譯器拋出需要類型錯誤。 – Aj1

回答

0

When I try to rise the loadYears(), i get error in console that Uncaught TypeError: this._cropYearService.getFieldYearData is not a function

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'); 
     }); 
} 
2

想通了。這是因爲$注入的順序。

+0

確實。請參閱https://docs.angularjs.org/guide/di上的$ inject Property Annotation。 – kliszaq