如果我正确理解,你想创建一个服务,可以作为角的DI过程中的帮手。
就像@Günter_Zöchbauer说的,Injectable不能用在Ng2对象(Component,Injectable ...)实例的外部,但在你的情况下,创建一个注射是无关紧要的。 创建角度应用并不意味着所有的文件必须包含的角度对象,你还可以创建基本的类/常数..
例如,如果希望建立一个网址给你的帮手,可以创建一个类,并通过简单地导入它来在组件声明中使用它。
//urlbuilder.ts
const host:string = 'http://foo.bar.com';
export class UrlBuilder {
static generate(file:string = '') {
return host + file;
}
}
// component.ts
import {UrlBuilder} from './urlbuilder';
@Component({
templateUrl: UrlBuilder.generate('/foo.html')
})
export class FooComponent {}
你甚至可以导出一个函数而不是类,它也可以工作。 以下代码显示与上面相同的代码,但带有一个功能和一个es6标签。
//urlbuilder.ts
const host:string = 'http://foo.bar.com';
export const UrlBuilder = urlBuilderFn;
//basic tag function that build a template string with potential variables
function urlBuilderFn(strs, ...raws) {
let builtStr = '', length = strs.length;
for(let i = 0; i < length; i++)
builtStr = strs[i] + (raws[i] !== undefined && raws[i] !== null ? raws[i] : '');
return host + builtStr;
}
// component.ts
import {UrlBuilder as url} from './urlbuilder';
@Component({
templateUrl: url`/foo.html`
})
export class FooComponent {}
但是,如果想使用你的助手与DI太(不管是什么原因,需要角度DEPS ..)可以使注射剂类的静态方法。
//urlbuilder.ts
const host:string = 'http://foo.bar.com';
@Injectable()
export class UrlBuilder {
constructor(private http:Http) {}
static generate(file:string = '') {
return host + file;
}
doSomething() {
return this.http.get(UrlBuilder.generate('/foo/bar'))
}
}
// component.ts
import {UrlBuilder} from './urlbuilder';
@Component({
templateUrl: UrlBuilder.generate('/foo.html')
})
export class FooComponent {
constructor(private builder:UrlBuilder) {}
ngOnInit() {
this.builder.doSomething()
}
}
在另一方面,如果你唯一的问题是与模板你为什么不直接写他们作为模板字符串或只是与你的任务管理器中导入它们(的WebPack ..)。一般来说,如果您没有动态视图,那么必须从服务器生成它们,而不是使用http调用来检索它们,并直接将它们加载到JavaScript文件中。
DI在装修中使用。有可能是黑客,但我很确定他们不能用AoT做例子。 –
是的,我认为它不应该这样工作,但不能以某种方式从另一个文件中导入一个函数,我可以在@Component声明中使用它?我只是不喜欢我现在正在做的是在10个不同的组件中复制代码,所以我可以注入正确的路径前缀。 – Methodician