So nach erneuter Lektüre dieses ausgezeichneten Beitrag von Pascal Precht: http://blog.thoughtram.io/angular/2015/05/18/dependency-injection-in-angular-2.html
Und da ihn kommentieren: http://twofuckingdevelopers.com/2015/04/angular-2-singleton-service/
„Alles, was mit injiziert DI Angular 2 ist bereits ein Singleton Kein Bedarf an. so ein Service "
Ich ging testen, und was ich jetzt gefunden habe beantwortet meine Frage und machte mich noch mehr verwirrt über das Thema DI in angular2.
Siehe den folgenden Code:
team.ts
import {BaseCollection, BaseModel} from "./base";
import {PlayerCollection} from './player';
import {Injectable, Inject} from "angular2/angular2";
@Injectable()
export class TeamCollection extends BaseCollection {
playerCollection: PlayerCollection;
constructor(@Inject(PlayerCollection) playerCollection: PlayerCollection) {
super();
this.playerCollection = playerCollection;
}
create(data: Object): TeamModel {
return new TeamModel(data);
}
}
player.ts
import {BaseCollection, BaseModel} from "./base";
import {Injectable} from "angular2/angular2";
@Injectable()
export class PlayerCollection extends BaseCollection {
create(data: Object): PlayerModel {
return new PlayerModel(data);
}
}
team.spec.ts
/// <reference path="../../typings.d.ts" />
//VERY IMPORTANT TO ALWAYS LOAD THESE
import 'zone.js';
import 'reflect-metadata';
import 'es6-shim';
import {TeamModel, TeamCollection} from "../../app/model/team";
import {PlayerCollection} from "../../app/model/player";
import {Inject, Injector} from "angular2/angular2";
describe('TeamCollection',() => {
var teamCollection: TeamCollection;
var playerCollection: PlayerCollection;
beforeEach(() => {
var injector = Injector.resolveAndCreate([
TeamCollection,
PlayerCollection
]);
teamCollection = injector.get(TeamCollection);
var injectorT = Injector.resolveAndCreate([
PlayerCollection
]);
playerCollection = injector.get(PlayerCollection);
});
it('should have a singleton PlayerCollection shared between all classes within the application',() => {
console.log(teamCollection.playerCollection.uuId);
console.log(playerCollection.uuId);
});
});
Solange es war der gleiche Injektor (var injector
), die beide erstellt haben sie die gleiche UUID teilen Wenn ich einen zweiten Injektor (var injectorT
) verwenden, sind die UUIDs anders, was bedeutet, dass eine neue Instanz der playerCollection erstellt wird.
Jetzt wäre meine Frage. Wenn ich die Syntax des Komponentenanbieters verwende:
Würden beide die gleiche Playersammlung teilen oder würden beide eine neue Instanz erstellen?
Bearbeiten: Sie tun, solange sie durch die bootstrap(.., [ServiceA,ServiceB])
Methode erstellt werden.
Dank pascal precht http://blog.thoughtram.io/angular/2015/09/17/resolve-service-dependencies-in-angular-2.html
Also .. eine Idee, wie Sie den Dienst innerhalb des anderen Dienstes verwenden, nachdem Sie Http verwendet haben, um Metadaten zu erstellen? Ich habe versucht, sein Beispiel, das ist in der Verbindung an der Unterseite, aber ich verstehe nicht, wie das den Dienst in einen anderen Dienst injiziert, oder wie Sie es verwenden .. Verwirrende Sachen. – Chrillewoodz
@Chrillewoodz Wenn Sie meinen, wie Sie einen Dienst in einen anderen injizieren sollen, nachdem Sie ihn der Bootstrap-Methode hinzugefügt haben. Das ist ziemlich einfach, wenn Sie Typoskript verwenden. Man schreibt es einfach in den Konstruktor: '' constructor (private http: Http) {} " –
Das habe ich ausprobiert, aber der Dienst endete immer als leeres Objekt, obwohl der Dienst viele Funktionen enthielt. Ich weiß nicht warum Ich glaube auch, dass es eine sauberere Möglichkeit geben muss, Dienste in einen anderen Dienst als die Bootstrap - Methode zu injizieren. Die Bootstrap - Methode wird wirklich schnell unordentlich, was seltsam erscheint. – Chrillewoodz