2014-09-30 3 views
4

Таким образом, в простом старом Угловом, вы бы придать завод так:Подайте завод в AngularJS с использованием машинописи

(function(angular){ 
    "use strict"; 

    var app = angular.module('app', []); 
    app.factory('MyFactory', ['$http', function($http) { 
    .... 
    }); 
}()); 

Теперь с помощью машинописи, я пытаюсь использовать $inject так:

module Services { 
    export class MyFactory { 
     static $inject = ['$http']; 
     constructor(private $http: ng.IHttpService) { 
     } 
    } 
} 

var app = angular.module('app', []); 

app.factory('MyFactory', Services.MyFactory) //<-- This does not work, never is instantiated. 

app.factory('MyFactory', ['$http', Services.MyFactory]); //<-- No deal, it has constructor dependencies 

// Seems you have to do this 
app.factory('MyFactory', ['$http', ($http) => new Services.MyFactory($http)]); 

Каков правильный способ введения фабрик в Угловое с помощью машинописного текста?

ответ

12

app.factory ('MyFactory', Services.MyFactory) Это не работает, никогда не создается.

Истина. Это связано с тем, что функция, переданная как второй аргумент (MyFactory), никогда не вызывается оператором new. Если вы хотите использовать класс TypeScript, вы: должны использовать service, а не factory.

Использование оператора new является только разницы между службой и заводом, так что нет нет оснований для вас использовать factory. Оба являются одноточечными в AngularJS.

+1

ОК, я имел в виду именно это. Спасибо за быстрый ответ. – Sam

+0

Контролируются ли контроллеры как услуги? Вызывается ли оператор 'new'? – Sam

+0

Кроме того, $ inject используется только для целей минимизации? – Sam

16

В этом проекте todoMvc они объявляют заводские функции как функции, а не как класс.

module Services { 
    export function MyFactory($http: ng.IHttpService): string{ 
    var stuff = "foo"; 
    return stuff; 
    } 
    MyFactory.$inject = ["$http"]; 
} 

app.factory("myFactory", Services.MyFactory); 

Поскольку директивы являются заводскими функциями, это синтаксис, который мы (в моем проекте) используем для директив. Тогда возвращаемый тип функции - ng.IDirective.

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

+1

Хотя принятый ответ полезен, на самом деле это правильный ответ на вопрос. – crimbo

3

Возьмем такой пример, как я уже создал HttpGet обертка

module portal.services { 


export class apiService { 


    public getData<T>(url?:string): ng.IPromise<T> { 

     var def = this.$q.defer(); 
     this.$http.defaults.headers.common.token = window.sessionStorage[localStorageNames.bearerToken] || 'UA'; 
     this.$http.get(this.config.apiBaseUrl + url).then((successResponse) => { 

      if(successResponse) 
       def.resolve(successResponse.data); 
      else 
       def.reject('server error'); 

     }, (errorRes) => { 

      def.reject(errorRes.statusText); 
     }); 

     return def.promise; 
    } 


    static $inject = ['$q','$http', 'config']; 

    constructor(public $q:ng.IQService,public $http:ng.IHttpService, public config:interfaces.IPortalConfig) { 


    } 

} 



} 


module portal { 
    export var app:ng.IModule =angular.module('portal',[]); 
    app.service(services); 

} 
Смежные вопросы