2016-04-07 11 views
0

Ich versuche, einen Login-Service (in Typoskript) schreiben, die den Benutzernamen und das Passwort an meine C# -Controller sendet. Der C# -Controller führt dann einen Serviceaufruf durch, der meine Datenbank anspricht, um den Benutzer zu authentifizieren, aber das ist für diese Frage nicht möglich.Angular Service-Funktion ist undefined - MVC6

Das Problem ist, dass wenn ich versuche, meine Authentifizierungsfunktion rufen von meiner Winkelsteuerung (die in meinem Winkel Dienst gefunden wird), erhalte ich einen Fehler in meiner Konsole, die es unable to get property 'Authenticate' of undefined or null reference. ist

Hier ist die Basisklasse (Handler) für meine Dienste:

module app.Services { 
export class HttpHandlerService { 
    httpService: ng.IHttpService; 
    handlerUrl: string; 

    constructor($http: ng.IHttpService) { 
     super(); 
     this.httpService = $http; 
    } 

    useGetHandler(params: any): ng.IPromise<any> { 
     var result: ng.IPromise<any> = this.httpService.get(this.handlerUrl, params) 
      .then((response: any): ng.IPromise<any> => this.handlerResponded(response, params)); 
     return result; 
    } 

    usePostHandler(params: any): ng.IPromise<any> { 
     var result: ng.IPromise<any> = this.httpService.post(this.handlerUrl, params) 
      .then((response: any): ng.IPromise<any> => this.handlerResponded(response, params)); 
     return result; 
    } 

    handlerResponded(response: any, params: any): any { 
     response.data.requestParams = params; 
     return response.data; 
    } 

} 
} 

Dann Anmeldungs ​​Service erbt es:

module app.Services { 
export interface ILoginService { 
    Authenticate(email: string, password: string): ng.IPromise<any>; 
} 

export class LoginService extends Services.HttpHandlerService { 

    static $inject = ['$http']; 

    constructor($http: ng.IHttpService) { 
     this.handlerUrl = '/Login'; 
     super($http); 
    } 

    // Authentication function I am attempting to call 
    Authenticate(email: string, password: string): ng.IPromise<any> { 

     // I have not completed the actual request that is being sent 
     var config: any = {}; 
     var request = { 
      "Email": email, 
      "Password": password 
     } 

     return this.usePostHandler(config); 
    } 
} 
angular.module('App').factory('loginService', LoginService); 
} 

Hier ist meine Login-Controller, wo ich bin Aufruf der Service:

module app.Login { 

import Services = app.Services; 

interface ILoginController { 
    email: string; 
    password: string; 
    login(): void; 
} 

class LoginController implements ILoginController{ 
    email: string; 
    password: string; 
    loginService: Services.ILoginService; 

    loginForm: any; 
    static $inject = ["$state"]; 
    constructor(private $state: ng.ui.IStateParamsService, loginService: Services.ILoginService) { 
     this.email = ""; 
     this.password = ""; 
     this.loginService = loginService; 
    } 

    login() { 
     if (this.loginForm.$invalid) { 
      return; 
     } 

     var request = this.loginService.Authenticate(this.email, this.password); 

     request.success(function (data) { 
      console.log("User authenticated."); 
     }); 

     request.error(function() { 
      console.log("Error: User not authenticated."); 
     }); 
    } 
} 
angular.module('App').controller('loginController', LoginController); 
} 

Und schließlich würde mein C# Controller“

[HttpPost] 
[Route("/Login")] 
public async Task<IActionResult> Login() 
{ 
    // . . . . 
} 

Jede Hilfe sehr geschätzt. Lassen Sie es mich wissen, wenn Sie mehr Informationen benötigen.

EDIT:

Dies ist Javascript aus dem Login-Dienst Typoskript generiert:

var __extends = (this && this.__extends) || function (d, b) { 

for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; 

function __() { this.constructor = d; } 

d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); 

}; 

var app; 

(function (app) { 

var Services; 

(function (Services) { 

    var LoginService = (function (_super) { 

     __extends(LoginService, _super); 

     function LoginService($http) { 

      this.handlerUrl = '/Login'; 

      _super.call(this, $http); 

     } 

     LoginService.prototype.Authenticate = function (email, password) { 

      var config = {}; 

      var request = { 

       "Email": email, 

       "Password": password 

      }; 

      return this.usePostHandler(config); 

     }; 

     LoginService.$inject = ['$http']; 

     return LoginService; 

    })(Services.HttpHandlerService); 

    Services.LoginService = LoginService; 

    angular.module('App').factory('loginService', LoginService); 

})(Services = app.Services || (app.Services = {})); 

})(app || (app = {})); 

ich eine Fehlermeldung erhalten, nur im IE, dass _super nicht definiert ist.

+0

Was ist die genaue Fehlermeldung? Diese Authentifizierungsfunktion ist nicht definiert oder die Eigenschaft loginService ist nicht definiert? – goenning

+0

'Kann die Eigenschaft 'Authenticate' von undefined oder Null-Referenz nicht bekommen. ' – cfly24

Antwort

0

Unable to get property 'Authenticate' of undefined or null reference. bedeutet, dass this.loginService nicht ordnungsgemäß von Angular injiziert wurde.

Sie können versuchen, zu ändern diese:

static $inject = ["$state"];

dazu:

static $inject = ["$state", "LoginService"];

Proper Dependency Injection in Your AngularJS TypeScript Apps

+0

Leider hat dies den Fehler nicht gelöst – cfly24

+0

Tatsächlich scheint es, dass es die JS nicht aktualisiert hat. Jetzt erhalte ich einen 'unbekannten Provider: LoginServiceProvider' Fehler, der wahrscheinlich nur eine fehlende Referenz ist – cfly24

+0

Stellt sich heraus, es war eine fehlende Referenz, alles gut! – cfly24