2015-04-30 6 views
5

У меня проблемы с моими угловыми контроллерами в AppGyver, так как конструктор никогда не вызывается. Я использую синтаксис «контроллер как» от углового, и я не знаю, поддерживает ли AppGyver его, поскольку все его документы связаны с «$ sintax», насколько я вижу. Это мой контроллер:AppGyver и угловые контроллеры в TypScript 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); 

И это мое мнение:

<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> 

Edit 1 JS генерироваться:

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); 

ответ

0

Это выглядит в основном хорошо. Вот некоторые вещи, чтобы попробовать:

  1. Нажмите F12 в браузере, и перейдите на вкладку Console, и посмотреть, если есть какая-либо ошибка, из-за угловые.

  2. Вместо этого:

    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; 
    } 
    

попробовать это:

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

В вашем браузере, поставить точку останова на этой линии и посмотреть, если он получает удар. Если это так, то по одному заново верните параметры конструктора и посмотрите, что приводит к его разрыву. У меня есть подозрение, что ваш параметр ILoginControllerScope вызывает проблемы, потому что инъекция зависимостей не знает, как создать экземпляр одного из них. Мне кажется, что вам это действительно не нужно, и вместо этого вы можете просто пойти с vanilla ng.IScope. ILoginControllerScope не добавляет никакого значения. Зачем вам нужен отдельный класс для хранения ссылки на контроллер?

+0

Мне нужен ILoginControllerScope, потому что мне нужно расширить интерфейс IScope, чтобы добавить новое свойство vm (с тех пор, как набирается TypScript), этот стиль кода отлично работал для меня в обычных браузерах. Я открыл консоль браузера, чтобы узнать, есть ли у меня какие-либо ошибки в AppGyver Connect, и я вижу, что он связан с бесконечным $ digest Loop. Спасибо за вашу помощь. –

+0

Хорошо, сделайте то, что вы считаете правильным. Но я все еще не думаю, что вам нужен ILoginControllerScope. В вашем HTML, когда вы указываете «loginController as vm», это уже дает вам переменную «vm», которую вы можете использовать для доступа к свойствам вашего контроллера. Вам не нужно отдельно хранить ссылку на ваш контроллер внутри вашего IScope. –

+0

Ну, это всего лишь синтаксический сахар, в итоге у сгенерированного JS его нет, а JS - то, что использует AppGyver. Я копирую сгенерированную JS на своем Edit 1 –