angular 2 webpackプロジェクトがあり、現在いくつかのコンポーネントで繰り返されるいくつかの機能があります。これらのすべてのコンポーネントを「マスター」クラスから継承したいと思いますORコンポーネント(どちらでも機能します)。必要なすべてのコンポーネントから関数を呼び出すことができます。
例として、3つの異なるコンポーネントに関数fooがある場合:
foo(s: string){
console.log(s);
}
この関数を別のファイル/クラス/コンポーネントに移動してください:
class parent{
foo(s: string){
console.log(s);
}
}
そして、与えられたコンポーネントからfoo関数を何らかの方法で呼び出す必要があります。例えば:
class child{
constructor(){
foo("Hello");
}
}
Angular 2/Typescriptを使用してこれを行うにはどうすればよいですか?
私はサービスを使用します。これは私のアプリの1つからの短縮例です。
import {Injectable} from '@angular/core';
import * as _ from 'lodash';
@Injectable()
export class UtilsService {
findObjectIndex(list: any[], obj: any, key: string): number {
return _.findIndex(list, function(item) {
return obj[key] === item[key];
});
}
findObjectByQuery(list: any[], key: string, query: string): any {
return _.find(list, function(item) {
return item[key].toLowerCase() === query.toLowerCase();
});
}
}
次に、このサービスを任意のものに注入することができます。これは非常に便利であり、物事をドライに保ちます。
次のように挿入するだけです。
import {UtilsService} from 'app/shared';
export MyComponent {
constructor(private utils: UtilsService) {
utils.findObjectIndex([], {}, 'id'); // just an example usage
}
}
編集:
@aalielfekyの答えが示すように、静的関数を使用できます。
ただし、静的関数は、適切にテストすることは不可能であり、関数の1つで使用されるコンストラクターに何かを挿入する必要が生じると、地獄を与えるので、静的関数は避けたいと思います。静的関数は注入されたものを使用できないため。
あなたは多くのコードを書き直さなければならないので、私と同じ間違いをしないでください。
すべてのメソッドが静的であるクラスを作成できます
export class Utils {
public static log(msg:string){
console.log(msg);
}
}
次に、使用したい場所にインポートします
import {Utils} from './utils'
class parent{
foo(s: string){
Utils.log(s);
}
}
class child{
constructor(){
Utils.log("Hello");
}
}
継承を使用する場合は、extends
キーワードです。
parent.class.ts
class parent{
foo(s: string){
console.log(s);
}
}
child.component.ts
import { Component } from "@angular/core";
import { parent } from "./parent.class";
@Component({
selector: 'child',
template: `<div>{{myMessage}}</div>`
})
export class child extends parent {
myMessage: string = "Hello";
constructor(){
super.foo(this.myMessage);
}
}
http://plnkr.co/edit/iQfqphLCx62Qy5lYVJa5?p=preview
デコレーション情報は失われるため、基本クラスに適用しないでください。また、子が持っていることを期待してください。
これらの目的で継承を使用するのは、ほぼこれで終わりです。共有サービスの他のメソッド、さらには静的クラスも実行可能です。それは本当にあなたがそれらで何を達成しようとしているのか、そしてどのパターンがあなたのユースケースに最もマッチするかに依存します。
すべての共通機能を含むutils.ts
を作成できます
export default class Utils {
static doSomething(val: string) { return val; }
static doSomethingElse(val: string) { return val; }
}
次に、次のように使用できます
import Utils from './utils'
export class MyClass {
constructor()
{
Utils.doSomething("test");
}
}