从其他组件调用函数时视图不更新 Angular + NativeSript(6)
View does not update when calling function from other component Angular + NativeSript(6)
从其他组件调用函数时,视图不会更新 Angular + NativeSript
。我正在调用一个函数来获取一些数据并进行渲染,但是数据没有显示在组件中,但是在 console log
中我可以看到数据在那里。
我在这里缺少什么?
我的Tabcomponent
这里调用了其他component
的函数:
@Component({
providers: [CartoesComponent],
selector: "ns-tabs",
templateUrl: "./tabs.component.html",
styleUrls: ["./tabs.component.css"],
moduleId: module.id
})
export class TabsComponent implements OnInit {
tabSelectedIndex: number;
constructor(private card: CartoesComponent) {
this.tabSelectedIndex = 0;
}
onSelectedIndexChanged(args: SelectedIndexChangedEventData) {
if (args.oldIndex !== -1) {
const newIndex = args.newIndex;
if (newIndex === 0) {
// the function im calling
this.card.getCards();
}
}
}
}
我调用的函数所在的组件:
@Component({
selector: "Cartoes",
moduleId: module.id,
templateUrl: "./cartoes.component.html",
styleUrls: ["./cartoes.css"]
})
export class CartoesComponent implements OnInit {
processing = false;
cardsData: any = null;
cardsDetails: any = null;
constructor() {}
getCards(): void {
this.processing = true;
this.service.cardsWallet().subscribe((res) => {
this.cardsData = res;
this.cardsData.forEach((data: any) => {
this.cardsDetails = data.cards;
});
// DISMISS LOADER
this.processing = false;
}, (err) => {
this.processing = false;
console.log(err);
});
}
}
我的视图组件xml(html)。
我的视图保持空白,但在 console.log 中我可以看到数据。
如果在 ngOnInit 上调用该函数,它会显示 de view 但当再次调用该函数时,它不会更新。
<Carousel debug="false" height="200" width="100%" indicatorOffset="0, 0" indicatorColor="#00E676" finite="true" bounce="true" showIndicator="true" verticalAlignment="top" android:indicatorAnimation="SCALE" indicatorColorUnselected="#000" [items]="cardsDetails">
<CarouselItem verticalAlignment="middle" *ngFor="let card of cardsDetails">
<AbsoluteLayout width="auto">
<!-- CARD IMG -->
<Image src="~/images/cartoes/card4.png" width="325" class="card-img"></Image>
<Image *ngIf="card?.cardBrand.cardBrandName === 'Mastercard'" src="~/images/cartoes/mastercard.png" width="50" class="card-img-detail"></Image>
<Image *ngIf="card?.cardBrand.cardBrandName === 'Visa'" src="~/images/cartoes/visa.png" width="50" class="card-img-detail"></Image>
<!-- CARD INFO -->
<label text="{{card?.cardDescription}}" class="card-info-description"></label>
<label text="{{card?.cardNumber}}" class="card-info-number"></label>
<label text="{{card?.expirityDate | date:'MM/yy'}}" class="card-info-validade" textWrap="true"></label>
<label text="{{card?.cardHolderName}}" class="card-info-nome" textWrap="true"></label>
</AbsoluteLayout>
</CarouselItem>
</Carousel>
实际上,您已经注入了您的组件并将其声明为提供者。
constructor(private card: CartoesComponent) {
this.tabSelectedIndex = 0;
}
这意味着 Angular 创建了该组件的一个实例 class 您可以调用它的方法。
但是,此实例 不引用任何真正呈现的组件 并且未绑定到您视图中的任何模板。因此,调用组件实例方法不应影响您的情况。
正确的方法应该是通过 ViewChild 装饰器引用组件(如果它位于父组件内)。在这种情况下,您使用准确呈现的组件进行操作并影响其模板。否则,您应该使用一些服务来在组件之间进行通信或共享公共数据。 Here 您可以找到有关组件通信的一些综合说明。
目前唯一的问题是,我不知道为什么调用 ngOnInit
可以处理这种情况,因为它不应该。弄清楚情况后,我会更新我的答案。
从其他组件调用函数时,视图不会更新 Angular + NativeSript
。我正在调用一个函数来获取一些数据并进行渲染,但是数据没有显示在组件中,但是在 console log
中我可以看到数据在那里。
我在这里缺少什么?
我的Tabcomponent
这里调用了其他component
的函数:
@Component({
providers: [CartoesComponent],
selector: "ns-tabs",
templateUrl: "./tabs.component.html",
styleUrls: ["./tabs.component.css"],
moduleId: module.id
})
export class TabsComponent implements OnInit {
tabSelectedIndex: number;
constructor(private card: CartoesComponent) {
this.tabSelectedIndex = 0;
}
onSelectedIndexChanged(args: SelectedIndexChangedEventData) {
if (args.oldIndex !== -1) {
const newIndex = args.newIndex;
if (newIndex === 0) {
// the function im calling
this.card.getCards();
}
}
}
}
我调用的函数所在的组件:
@Component({
selector: "Cartoes",
moduleId: module.id,
templateUrl: "./cartoes.component.html",
styleUrls: ["./cartoes.css"]
})
export class CartoesComponent implements OnInit {
processing = false;
cardsData: any = null;
cardsDetails: any = null;
constructor() {}
getCards(): void {
this.processing = true;
this.service.cardsWallet().subscribe((res) => {
this.cardsData = res;
this.cardsData.forEach((data: any) => {
this.cardsDetails = data.cards;
});
// DISMISS LOADER
this.processing = false;
}, (err) => {
this.processing = false;
console.log(err);
});
}
}
我的视图组件xml(html)。 我的视图保持空白,但在 console.log 中我可以看到数据。 如果在 ngOnInit 上调用该函数,它会显示 de view 但当再次调用该函数时,它不会更新。
<Carousel debug="false" height="200" width="100%" indicatorOffset="0, 0" indicatorColor="#00E676" finite="true" bounce="true" showIndicator="true" verticalAlignment="top" android:indicatorAnimation="SCALE" indicatorColorUnselected="#000" [items]="cardsDetails">
<CarouselItem verticalAlignment="middle" *ngFor="let card of cardsDetails">
<AbsoluteLayout width="auto">
<!-- CARD IMG -->
<Image src="~/images/cartoes/card4.png" width="325" class="card-img"></Image>
<Image *ngIf="card?.cardBrand.cardBrandName === 'Mastercard'" src="~/images/cartoes/mastercard.png" width="50" class="card-img-detail"></Image>
<Image *ngIf="card?.cardBrand.cardBrandName === 'Visa'" src="~/images/cartoes/visa.png" width="50" class="card-img-detail"></Image>
<!-- CARD INFO -->
<label text="{{card?.cardDescription}}" class="card-info-description"></label>
<label text="{{card?.cardNumber}}" class="card-info-number"></label>
<label text="{{card?.expirityDate | date:'MM/yy'}}" class="card-info-validade" textWrap="true"></label>
<label text="{{card?.cardHolderName}}" class="card-info-nome" textWrap="true"></label>
</AbsoluteLayout>
</CarouselItem>
</Carousel>
实际上,您已经注入了您的组件并将其声明为提供者。
constructor(private card: CartoesComponent) {
this.tabSelectedIndex = 0;
}
这意味着 Angular 创建了该组件的一个实例 class 您可以调用它的方法。
但是,此实例 不引用任何真正呈现的组件 并且未绑定到您视图中的任何模板。因此,调用组件实例方法不应影响您的情况。
正确的方法应该是通过 ViewChild 装饰器引用组件(如果它位于父组件内)。在这种情况下,您使用准确呈现的组件进行操作并影响其模板。否则,您应该使用一些服务来在组件之间进行通信或共享公共数据。 Here 您可以找到有关组件通信的一些综合说明。
目前唯一的问题是,我不知道为什么调用 ngOnInit
可以处理这种情况,因为它不应该。弄清楚情况后,我会更新我的答案。