后退按钮清除 Nativescript 6 中操作栏的标题
BackButton clear Title of Actionbar in Native Script 6
我有一项服务可以更改动态操作栏的标题,但是当我点击 android 上的后退按钮时,当我返回时它会保留新标题而不是旧标题:
例如:产品 > 详细信息。当我再次回击它的停留细节而不是产品时;
我在这里缺少什么??
service.ts
import { Injectable, OnInit } from "@angular/core";
import { BehaviorSubject, Observable } from "rxjs/index";
@Injectable()
export class ActionBarService implements OnInit {
// tslint:disable-next-line: ban-types
private title = new BehaviorSubject<String>("ActionBar");
private title$ = this.title.asObservable();
constructor() {}
ngOnInit() {
this.getTitle();
}
// tslint:disable-next-line: ban-types
setTitle(title: String) {
this.title.next(title);
}
// tslint:disable-next-line: ban-types
getTitle(): Observable<String> {
return this.title$;
}
}
操作栏xml
<!--ACTION BAR-->
<ActionBar class="action-bar roboto-regular">
<NavigationButton icon="res://menu" (tap)="openDrawer()" *ngIf="title !== 'Detail' " ></NavigationButton>
<NavigationButton icon="res://back" (tap)="goBack()" *ngIf="title === 'Product ' " ></NavigationButton>
<ActionItem ios.systemIcon="2" icon="res://shopping_black" ios.position="right"></ActionItem>
<StackLayout orientation="horizontal"
<Label class="action-bar-title" text="{{title}}" padding="10"></Label>
</StackLayout>
</ActionBar>
<!--ACTION BAR-->
Actionbar.ts
import { Component, OnInit } from "@angular/core";
import { ActionBarService } from "../shared/action-bar-title";
@Component({
selector: "actionbar-place",
moduleId: module.id,
templateUrl: "./actionbar.component.html",
styleUrls: ["./actionbar.css"]
})
export class MarketPlaceComponent implements OnInit {
title: any;
constructor(private actionBarTitle: ActionBarService) {
}
ngOnInit() {
this.actionBarTitle.getTitle().subscribe((appTitle) => {
this.title = appTitle;
});
}
产品和详细信息page.ts
ngOnInit() {
this.actionBarTitle.setTitle("My Title");
}
这完全是预料之中的,你有一个服务实例(我相信你已经将它注入到模块/根目录中),它只有一个 title$ (Observable) 实例,它的值在每个 ngOnInit
.
因此,当您从 Product 导航到 Detail 时,在 Detail 组件上触发的 ngOnInit
将使用 Detail 标题更新 Observable,同时前一个组件(Product)中的 ActionBar 也在监听更改也会更新它自己的标题。
我认为这是一种开销,使用服务来更新 ActionBar 标题。您可以简单地从 ActionBar 公开 @Input 并在每次将其放入组件时设置标题。或者,如果您仍然喜欢使用服务,则在组件级别将其标记为提供者,这样每个组件都会有自己的实例,因此不会干扰其他组件。
通过执行@Manoj 建议的操作解决“@Input from ActionBar 并在每次将其放入组件时设置标题。”
actionBar.xml
ActionBar [title]="MyTitle" backgroundColor="green" class="action-bar"></ActionBar>
actionBar.ts
export class ActionBarComponent{
@Input() MyTitle:string;
}
产品和详情page.ts
<ab-component MyTitle="sample title">
...
我有一项服务可以更改动态操作栏的标题,但是当我点击 android 上的后退按钮时,当我返回时它会保留新标题而不是旧标题: 例如:产品 > 详细信息。当我再次回击它的停留细节而不是产品时; 我在这里缺少什么??
service.ts
import { Injectable, OnInit } from "@angular/core";
import { BehaviorSubject, Observable } from "rxjs/index";
@Injectable()
export class ActionBarService implements OnInit {
// tslint:disable-next-line: ban-types
private title = new BehaviorSubject<String>("ActionBar");
private title$ = this.title.asObservable();
constructor() {}
ngOnInit() {
this.getTitle();
}
// tslint:disable-next-line: ban-types
setTitle(title: String) {
this.title.next(title);
}
// tslint:disable-next-line: ban-types
getTitle(): Observable<String> {
return this.title$;
}
}
操作栏xml
<!--ACTION BAR-->
<ActionBar class="action-bar roboto-regular">
<NavigationButton icon="res://menu" (tap)="openDrawer()" *ngIf="title !== 'Detail' " ></NavigationButton>
<NavigationButton icon="res://back" (tap)="goBack()" *ngIf="title === 'Product ' " ></NavigationButton>
<ActionItem ios.systemIcon="2" icon="res://shopping_black" ios.position="right"></ActionItem>
<StackLayout orientation="horizontal"
<Label class="action-bar-title" text="{{title}}" padding="10"></Label>
</StackLayout>
</ActionBar>
<!--ACTION BAR-->
Actionbar.ts
import { Component, OnInit } from "@angular/core";
import { ActionBarService } from "../shared/action-bar-title";
@Component({
selector: "actionbar-place",
moduleId: module.id,
templateUrl: "./actionbar.component.html",
styleUrls: ["./actionbar.css"]
})
export class MarketPlaceComponent implements OnInit {
title: any;
constructor(private actionBarTitle: ActionBarService) {
}
ngOnInit() {
this.actionBarTitle.getTitle().subscribe((appTitle) => {
this.title = appTitle;
});
}
产品和详细信息page.ts
ngOnInit() {
this.actionBarTitle.setTitle("My Title");
}
这完全是预料之中的,你有一个服务实例(我相信你已经将它注入到模块/根目录中),它只有一个 title$ (Observable) 实例,它的值在每个 ngOnInit
.
因此,当您从 Product 导航到 Detail 时,在 Detail 组件上触发的 ngOnInit
将使用 Detail 标题更新 Observable,同时前一个组件(Product)中的 ActionBar 也在监听更改也会更新它自己的标题。
我认为这是一种开销,使用服务来更新 ActionBar 标题。您可以简单地从 ActionBar 公开 @Input 并在每次将其放入组件时设置标题。或者,如果您仍然喜欢使用服务,则在组件级别将其标记为提供者,这样每个组件都会有自己的实例,因此不会干扰其他组件。
通过执行@Manoj 建议的操作解决“@Input from ActionBar 并在每次将其放入组件时设置标题。”
actionBar.xml
ActionBar [title]="MyTitle" backgroundColor="green" class="action-bar"></ActionBar>
actionBar.ts
export class ActionBarComponent{
@Input() MyTitle:string;
}
产品和详情page.ts
<ab-component MyTitle="sample title">
...