2015-04-30 10 views
5

Ho problemi con i miei controller angolari in AppGyver, poiché il costruttore non viene mai chiamato. Sto usando la sintassi "controller as" da angular, e non so se AppGyver lo supporta, dal momento che tutta la sua documentazione è con "$ scope sintax", per quanto vedo. Questo è il mio controller:AppGyver e controller angolari in Typescript 1.4

interface ILoginControllerScope extends ng.IScope { 
    vm: LoginController; 
} 

interface ILoginController { 
    Login(): any; 
} 

class LoginController implements ILoginController { 
    static $inject: any = ['$scope', 'supersonic', 'steroids']; 
    constructor(private $scope: ILoginControllerScope, private supersonic: any, private steroids: any) { 
     this.supersonic.logger.log('This should be called'); 
     $scope.vm = this; 

    } 
    Login(): any { 
    } 
    static controllerId(): string { 
     return 'loginController'; 
    } 
} 

appUsers.controller(LoginController.controllerId(), LoginController); 

E questo è il mio punto di vista:

<div ng-controller="loginController as vm" class="padding"> 
    <div> 

    </div> 
    <div ng-hide="addonsUndefined"> 
     <h1 class="center">Caredfor</h1> 
     <div class="center"> 
      <img class="logoSize" src="/images/logo.png"> 
     </div> 

     <div> 
      <button class="button button-block button-positive icon-left super-social-facebook" ng-click="vm.Login()">Sign in with Facebook</button> 
     </div> 
    </div> 
</div> 

Modifica 1 La JS ha generato:

var LoginController = (function() { 

    function LoginController($scope, supersonic) { 
     this.supersonic = supersonic; 
     supersonic.logger.log('This should be called'); 
     $scope.vm = this; 

    LoginController.controllerId = function() { 
     return 'loginController'; 
    }; 

    LoginController.prototype.Login = function() { 
    }; 
    return LoginController; 
})(); 

appUsers.controller(LoginController.controllerId(), LoginController); 

risposta

0

Sembra per lo più buona. Qui ci sono alcune cose da provare:

  1. Premere F12 nel browser, e andare alla scheda Console, e vedere se ci sono errori da angolare.

  2. Invece di questo:

    static $inject: any = ['$scope', 'supersonic', 'steroids']; 
    constructor(private $scope: ILoginControllerScope, private supersonic: any, private steroids: any) { 
        this.supersonic.logger.log('This should be called'); 
        $scope.vm = this; 
    } 
    

provare questo:

constructor() { 
     var i:number = 7; 
    } 

Nel browser, mettere un punto di interruzione in quella riga e vedere se viene colpita. Se lo fa, quindi uno alla volta, reinserisci i parametri del tuo costruttore, e vedi quale è il motivo per cui si rompe. Ho il sospetto che il tuo parametro ILoginControllerScope stia causando problemi, perché l'iniezione della dipendenza non sa come istanziare uno di questi. Mi sembra che tu non ne abbia davvero bisogno, e puoi invece andare con il vanilla ng.IScope. ILoginControllerScope non aggiunge alcun valore. Perché hai bisogno di una classe separata per memorizzare un riferimento al controller?

+0

Ho bisogno di ILoginControllerScope perché devo estendere l'interfaccia IScope per aggiungere la nuova proprietà vm (dal momento che Typescript è digitato), questo tipo di codice ha funzionato perfettamente per me nei normali browser. Ho aperto la console del browser per vedere se ho degli errori su AppGyver Connect e ne vedo uno relativo a un ciclo digest infinito $. Grazie per il tuo aiuto –

+0

Ok, fai ciò che ritieni giusto. Ma continuo a non pensare che tu abbia bisogno di ILoginControllerScope. Nel codice HTML, quando si specifica "loginController as vm", questo fornisce già una variabile "vm" che è possibile utilizzare per accedere alle proprietà del controller. Non è necessario memorizzare separatamente un riferimento al controller all'interno di IScope. –

+0

Beh, è ​​solo uno zucchero sintattico, alla fine il JS generato non ce l'ha, e il JS è ciò che sta usando AppGyver. Copio il JS generato sul mio Edit 1 –