Внедрить factory в контроллер angularjs + typescript

Я пытался внедрить factory в контроллер, используя как Angularjs, так и Typescript, но получаю эту ошибку Error: [$injector:unpr] http://errors.angularjs.org/1.2.9/$injector/unpr?p0=AuthenticationProvider%20%3C-%20Authentication.

Я исследовал, но не могу найти решение, потому что то, что я сделал, похоже на некоторые решения.

Вот мой модуль контроллера входа

import Authentication = require('AuthenticationService');
module LoginController{

export interface UIMainScope extends ng.IScope {
    login: (credential: any) => void;
}

export class Controller {
    static $inject = ['$scope', '$http', 'Main', 'Authentication'];
    constructor (){}
}
export = LoginController
angular.module('App').controller('Controller', LoginController.Controller);

Я забыл что-то ввести сюда, чтобы вызвать метод?


person Test    schedule 03.07.2014    source источник


Ответы (2)


Проблема здесь связана с тем, что угловой $inject не может получить прибыль от Typescript require. Это независимые признаки, они представляют разные понятия.

Угловой [$inject][1] как встроенный внедрение зависимостей может вводить только то, что уже зарегистрировано. У него нет доступа к объектам Typescript — только к собственной (угловой) фабрике объектов.

Поскольку ошибка говорит: неизвестный поставщик 'AuthenticationProvider', мы должны вызвать:

angular.module('App')
  .factory('Authentication', [... its dependencies ...
      , (params) => new Authentication(params)]);

Теперь у нас есть готовая аутентификация в angular, и мы можем запросить ее внутри нашего контроллера.

Синтаксис может выглядеть так:

// module with Scope and Controller
module LoginController
{
  export interface UIMainScope extends ng.IScope 
  {
    login: (credential: any) => void;
  }

  export class Controller
  {
    // constructor, instantiating private members this.$scope ...
    constructor($scope: UIMainScope
       , $http :ng.IHttpService
       , Main: any
       , Authentication: any)
    ...
  }
}

// and finally pass it into angular as .controller()
angular.module('App')
  .controller('Controller', [
     '$scope', '$http', 'Main', 'Authentication',
     ($scope, $http, Main, Authentication)  =>
     {
        return new LoginController.Controller($scope, $http, Main, Authentication);
     }
]);

Наконец: в случаях, когда провайдер Authentication не получит выгоду от запуска с Angular, мы также можем использовать его. Нам вообще НЕ нужно его регистрировать. Просто вызовите require и получите доступ к его методам... но мы должны пропустить процесс $inject Angular...

Возможно, это не тот случай, но представьте себе некоторый QueryStringBuilder..., который мог бы потреблять только переданные параметры в методе Builder.build(...)

person Radim Köhler    schedule 03.07.2014
comment
Это связано с тем, что отсутствует объявление .factory('Authentication'). Если это находится в другом модуле (например, «Аутентификация»), не забудьте указать ссылку на модуль в файле angular.module('App',[...here reference like, 'Auth']). Последняя строка в моем ответе представляет стандартное угловое определение .controller(). Ошибка представляет стандартную ситуацию, когда какая-то зависимость отсутствует... Помогает? - person Radim Köhler; 03.07.2014
comment
Да, это так. Благодарю вас! Когда я это делаю, я подумал: static $inject = ['$scope', '$http', 'UIMainUIModelService', 'Authentication']; ==> это в основном вставка в модуль, в то время как импорт будет импортировать и ссылаться на модуль? - person Test; 03.07.2014
comment
$inject – это мир angular, import – мир typescript. Они полностью независимы. Разные концепции. $inject может вводить только то, что уже было зарегистрировано. У него нет доступа к импортированным материалам TS. Итак, если вы пропишете .factory('Authentication'...) в angular (если нам нравится TS, то это будет почти такой же способ/стиль, как я показывал для контроллера) - тогда вы можете попросить $inject использовать его.. , Жаль, что теперь это более ясно ;) - person Radim Köhler; 03.07.2014
comment
Это объяснение имеет большой смысл сейчас. Когда вы говорите зарегистрироваться в Angular, вы имеете в виду регистрацию в самом приложении или в модуле контроллера? - person Test; 04.07.2014
comment
Да, чтобы ввести его через factory() внутри модуля приложения - person Radim Köhler; 04.07.2014

Похоже, у вас нет службы Authentication, зарегистрированной специально для angular:

angular.module('App').controller('Controller', LoginController.Controller)
    // fix based on your code 
    .service('Authentication',Authentication.AuthenticationService); 

Это видео может помочь : https://www.youtube.com/watch?v=Yis8m3BdnEM&hd= 1

person basarat    schedule 03.07.2014