0

我有這個簡單的服務,這是一個兩provider模塊:Angular 5:組件之間共享數據的服務(跨模塊)?

@Injectable() 
export class PlatformPickerService { 
    platforms: string[] = [ 
    'macOS', 'Linux', 'Windows' 
    ]; 
    public platform: string; 

    constructor() { 
    this.platform = this.platforms[1]; 
    } 

    public getPlatform(): string { 
    const platform = localStorage.getItem('platform'); 
    return platform == null ? this.platform : platform; 
    } 

    public setPlatform(platform: string) { 
    this.platform = platform; 
    localStorage.setItem('platform', platform); 
    } 
} 

不幸的是,無處我用它收購了選擇的值。在Module之外使用它只給出默認值,在Module中使用它不會給出任何值。

全測試用例:https://stackblitz.com/edit/angular-aru94g-2djexv

回答

1

終於得到它的工作:https://angular-aru94g-w6qy21.stackblitz.ioedit

主要變化是:

組件

updateService(event: any) { 
    if (event.value != null) this.platformPickerService.setPlatform(event.value); 
} 
<mat-form-field> 
    <mat-select placeholder="Platform" shouldLabelFloat="false" 
       [(ngModel)]="platformSelectd" 
       (selectionChange)=updateService($event)> 
    <mat-option *ngFor="let platform of platformPickerService.platforms" 
       [value]=platform> 
     {{ platform }} 
    </mat-option> 
    </mat-select> 
</mat-form-field> 

模塊

  • 只有PlatformPickerService在一個模塊(app.module)

現在是時候嘗試重寫制定者/吸氣再一次,看看是否會工作(setPlatformset platform)= 3

+0

更改服務中的默認值是否在下拉框中生效? – nayakam

+0

是的,它的確如此。 –

+0

是嗎?在你的演示中,默認顯示MacOS,但在PlatformPickerService默認值設置爲「Linux」的平臺[1]。 – nayakam

1

服務是一個噴射器的範圍之內的單身。將PlatformPickerService定義爲應用程序模塊或根模塊中的提供者,並將其作爲單例服務。這將是應用程序範圍的單身服務。

好的,問題與您的PlatformPickerComponent。您必須將選定的值發送到updateService。

  • 屬性綁定 - [] =>組件到模板 - 一種結合方式, 變更值在組件不更新屬性

    [值] = 「platformSelected」

  • 事件綁定 - ()=>模板與組分

    (三「更新服務($ event.value)」

  • PlatformPickerService已移至此示例的應用程序模塊並設置爲應用程序作用域提供程序。

請檢查sample appdemo

在PlatformPickerService中設置的默認平臺值每當更改時都會在下拉框中顯示爲選定值。

constructor() { 
    this.platform = this.platforms[4]; 
    } 
+0

我在app.module中有。我試着把它從platform-picker.module中取出來,把它從app.module中取出來;錯誤遺留:( –

+0

評論到您的編輯:我試着把'updateService'放入'{{'模板;同樣的錯誤 –

+0

@AT更新了你的應用程序的一些小修改hth – nayakam

0

你已經錯過了兩路在FormsModulePlatformPickerComponent 添加導入綁定到PlatformPickerModule和改變,如下PlatformPickerComponent

<mat-form-field> 
    <mat-select placeholder="Platform" shouldLabelFloat="false" [(ngModel)]="platform"> 
    <mat-option *ngFor="let platform of platformPickerService.platforms" 
       [value]="platform"> 
     {{ platform }} 
    </mat-option> 
    </mat-select> 
</mat-form-field> 



import {AfterViewInit, Component, OnInit} from '@angular/core'; 

import {PlatformPickerService} from './platform-picker.service'; 

@Component({ 
    selector: 'platform-picker', 
    templateUrl: './platform-picker.component.html', 
    styleUrls: ['./platform-picker.component.css'] 
}) 
export class PlatformPickerComponent implements OnInit, AfterViewInit { 
    private _platform: string; 

    constructor(public platformPickerService: PlatformPickerService) { 
    } 

    ngOnInit() { 
    this._platform = this.platformPickerService.getPlatform(); 
    } 

    ngAfterViewInit() { 
    } 

    get platform(): string { 
    return this._platform; 
    } 

    set platform(value: string) { 
    if (value != null) { 
     this.platformPickerService.setPlatform(value); 
     this._platform = value; 
    } 
    } 
} 
+0

是的,我有點欺騙了這兩種方式,因爲'(selected)= updateService()'沒有被調用;所以它使用'[value]'命中了模型,因此你找到的修復不起作用,對吧? - PS:我在我的服務中有'獲取平臺'和'設置平臺',但是我在Gitter/angular的人告訴我之後將其取出。他們可以使用嗎? –

0

我做了一些改動,以現有的代碼。 如果您使用雙向綁定,那麼您可以跳過ngModelChange 否則,請按照以下方式使用單向綁定和ngModelChange。

<mat-form-field> 
    <mat-select [ngModel]="selected" (ngModelChange)="updateService($event)" placeholder="Platform" shouldLabelFloat="false" [(value)]="selected"> 
    <mat-option *ngFor="let platform of platformPickerService.platforms" 
       [value]="platform"> 
     {{ platform }} 
    </mat-option> 
    </mat-select> 
</mat-form-field> 

,你updateService功能如下

updateService(newPlatform) { 
    console.log(newPlatform); 
    if (newPlatform != null) { 
     this.selected = newPlatform; 
     this.platformPickerService.setPlatform(this.selected); 
    } 
    } 

您可以檢查這裏的代碼 https://angular-aru94g-agtn1m.stackblitz.io

+0

謝謝,但該演示不起作用。選擇不默認,更改下拉值不會在其他地方更改(即:其他組件)。 –

+0

對不起,我提供了你沒有分叉的鏈接。但上面的代碼是正確的。你已經粘貼了相同的答案。 – Gautam

+0

已更新的鏈接https://angular-aru94g-bjgeaf.stackblitz.io/ – Gautam

相關問題