使用打字稿
问题描述:
所以在注射在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)]);
使用Typescript在Angular中注入工厂的正确方法是什么?
答
app.factory('MyFactory',Services.MyFactory)这不起作用,永远不会实例化。
是的。这是因为作为第二个参数传递的函数(MyFactory
)决不会用new
运算符调用。如果你想使用TypeScript类,你必须必须使用service
而不是factory
。
的new
操作者的使用是服务和工厂之间的唯一区别,所以你没有理由使用factory
。两者都是AngularJS中的单身人士。
答
在这个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在你的情况下使用.service更好。这仅供参考,您可以如何在打字稿中编写一个有角度的工厂。
+1
虽然接受的答案有帮助,但实际上这是问题的正确答案。 – crimbo 2015-11-02 14:03:52
答
拿这个例子,因为我创造了一个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);
}
OK,我想这一点。感谢你及时的答复。 – Sam 2014-09-30 04:08:57
控制器是否像服务一样注入?用“new”运算符调用吗? – Sam 2014-09-30 04:10:58
另外,$注入是否仅用于缩小目的? – Sam 2014-09-30 04:15:51