Meine App hat einen NameService, der den Namen enthält.
Es gibt zwei untergeordnete Komponenten von App, Navbar und TheContent, die auf diesen Dienst verweisen. Immer wenn sich der Name im Dienst ändert, möchte ich, dass er in beiden anderen Komponenten aktualisiert wird. Wie kann ich das machen?
import {Component, Injectable} from 'angular2/core'
// Name Service
@Injectable()
class NameService {
name: any;
constructor() {
this.name = "Jack";
}
change(){
this.name = "Jane";
}
}
// The navbar
@Component({
selector: 'navbar',
template: '<div>This is the navbar, user name is {{name}}.</div>'
})
export class Navbar {
name: any;
constructor(nameService: NameService) {
this.name = nameService.name;
}
}
// The content area
@Component({
selector: 'thecontent',
template: '<div>This is the content area. Hello user {{name}}. <button (click)=changeMyName()>Change the name</button></div>'
})
export class TheContent {
name: any;
constructor(public nameService: NameService) {
this.name = nameService.name;
}
changeMyName() {
this.nameService.change();
console.log(this.nameService.name);
}
}
@Component({
selector: 'app',
providers: [NameService],
directives: [TheContent, Navbar],
template: '<navbar></navbar><thecontent></thecontent>'
})
export class App {
constructor(public nameService: NameService) {
}
}
javascript
angular
B Rumpf
quelle
quelle
let subscription=nameService.nameChange.subscribe((value) => { this.name = value; }); subscription.unsubscribe()
. Ich habe mich diesem Problem gestellt, daher der Haftungsausschluss. Wenn das Abonnement von einer anderen Methode gekündigt werden muss, sollte die Variable auf Klassenebene seinproperty 'emit' does not exist on type 'Subject<string>'
. Vermisse ich etwas in der obigen Lösung? Gibt es einen funktionierenden Plunkr dieser Lösung?subscribe()
bei der Namensänderung übergeben wird, selbst wenn er bereits zerstört ist, da das Abonnement aktiv bleibt, bis die Komponente Müll gesammelt wird, was wahrscheinlich erst nach dem Abonnement geschieht abgesagt.Da es sich bei
name
inNameService
um einen primitiven Typ handelt, erhalten Sie eine andere Instanz im Dienst und in Ihren Komponenten. Wenn Sie ändernname
inNameService
, haben die Bauteileigenschaften noch den Anfangswert und die Bindung nicht funktioniert wie erwartet.Sie sollten hier die winkel1 "Punktregel" anwenden und an einen Referenztyp binden. Ändern Sie
NameService
diese Option , um ein Objekt zu speichern, das den Namen enthält.export interface Info { name:string; } @Injectable() class NameService { info: Info = { name : "Jack" }; change(){ this.info.name = "Jane"; } }
Sie können an dieses Objekt binden und
name
automatisch Aktualisierungen der Eigenschaft erhalten.// The navbar @Component({ selector: 'navbar', template: '<div>This is the navbar, user name is {{info.name}}.</div>' }) export class Navbar { info: Info; constructor(nameService: NameService) { this.info = nameService.info; } }
quelle
providers
beide Komponenten definieren . Auf diese Weise hat jede Komponente ihre eigeneNameService
plnkr.co/edit/nScZgT1hsIKHZ7Z5E6u3?p=previewname
Eigenschaft im Service vornehmen, steht in keinem Zusammenhang mit Änderungen, die Sie an der primitivenname
Eigenschaft in der Komponente vornehmen .name
inNameService
Sie eine andere Instanz im Dienst und Ihre Komponenten habe.“ Auch wenn Sie den Wert nicht ändern, erhält die Komponentename
im Konstruktor eine eigene primitive Eigenschaft. Der Anfangswert dieser neuen primitiven Eigenschaft ist der Wert dername
Eigenschaft im Service zum Zeitpunkt der Zuweisung. Der Punkt, den ich versuche, ist, dass Sie mit primitiven Typen nie dieselbe "Instanz" haben. Bei einem mit Referenztypen können Sie zwei (oder mehr) Dinge erhalten, die auf dieselbe Instanz verweisen.Ich denke, dass die von Günter bereitgestellte Lösung die beste ist.
Sie müssen sich jedoch bewusst sein, dass Angular2-Dienste Singleton-Dienste sind, die in einem Baum von Injektoren stattfinden. Dies bedeutet, dass:
bootstrap
Methode), kann die Instanz von allen Elementen (Komponenten und Service) gemeinsam genutzt werden.providers
Attributs) definieren, ist die Instanz spezifisch für die Komponente und ihre Unterkomponenten.Weitere Einzelheiten zu diesem Aspekt finden Sie im Dokument "Hierarchical Dependency Injection": https://angular.io/docs/ts/latest/guide/hierarchical-dependency-injection.html
Hoffe es hilft dir, Thierry
quelle