我的应用程序变得非常大,所以我试图将我的组件分离到模块但由于某种原因我不能让我的历史宏组件在我的EditMealModalModule的一个组件中工作。我正在我的AppModule中导出historyMacroComponent。
这是我的AppModule.ts:
@NgModule({
declarations: [
MyApp,
Home,
ProgressComponent,
SettingsModal,
VisualizeModal,
EducationModal,
AddMealsModal,
ShowMealModal,
AddMacrosModal,
VisualizeMacroModal,
MealsModal,
WeightPage,
TabsPage,
WlTrackerComponent,
CalorieTrackingComponent,
PieGraphComponent,
HistoryItemComponent,
HistoryMacroComponent,
LegendItemComponent,
MacroModeComponent,
LazyKetoModeComponent,
SavedMealIconComponent,
DayActionsComponent,
MacroSummaryComponent,
MealComponent,
Filter
],
imports: [
BrowserModule,
IonicModule.forRoot(MyApp, {
scrollAssist: true,
autoFocusAssist: true
}),
IonicStorageModule.forRoot(),
FormsModule,
EditMealModalModule,
EditMacroModalModule,
MonthlySuccessModule
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
Home,
WeightPage,
TabsPage
],
providers: [
{
provide: ErrorHandler,
useClass: RavenErrorHandler
},
Day,
Carbs,
Database,
Weight,
PageManager,
Analytics,
Meals
],
exports: [
HistoryMacroComponent
]
})
export class AppModule {
}
这是我的EditMealModalModule.ts:
@NgModule({
declarations: [
EditMacroModal
],
imports: [
IonicPageModule.forChild(EditMacroModal)
],
exports: [
EditMacroModal
]
})
export class EditMacroModalModule {}
这是我的HistoryMacroComponent.ts:
import { Component, Input } from '@angular/core';
import { MacroRecord } from '../../providers/carbs';
import { Day } from '../../providers/day';
@Component({
selector: 'history-macro',
templateUrl: 'history-macro.html'
})
export class HistoryMacroComponent {
@Input() item: MacroRecord;
constructor(public dayService: Day) {
}
}
HistoryMacroComponent.html:
<div class="history-item">
<saved-meal-icon [title]="item.title"></saved-meal-icon>
<div class="history-macro-legends">
<div class="history-macro-legends-first">
<legend-item colour="#0eabd8" [amount]="item.count" unit="g"></legend-item>
<legend-item colour="#ec226c" [amount]="item.fat" unit="g"></legend-item>
</div>
<div>
<legend-item colour="#58c912" [amount]="item.protein" unit="g"></legend-item>
<legend-item colour="#ffc105" [amount]="item.calories" unit="kcal"></legend-item>
</div>
</div>
<span class="history-ago">{{dayService.dateToTime(item.timestamp) }}</span>
</div>
EditMealModal.ts:
import { Component } from '@angular/core';
import { IonicPage, NavParams, ViewController } from 'ionic-angular';
import { Analytics } from "../../providers/analytics";
import { Validators, FormGroup, FormBuilder } from "@angular/forms";
import {MealRecord, Meals} from "../../providers/meals";
@IonicPage()
@Component({
selector: 'page-edit-meal-modal',
templateUrl: 'edit-meal-modal.html',
})
export class EditMealModal {
public form: FormGroup;
constructor(public params: NavParams,
private viewCtrl: ViewController,
private fb: FormBuilder,
private mealsService: Meals,
private analytics: Analytics) {
this.analytics.trackView(`Edit Meal Page`);
}
public ngOnInit() {
const form = {
title: [null, Validators.required],
carbs: [null],
fat: [null],
protein: [null],
details: [null],
calories: [null]
};
this.form = this.fb.group(form);
this.setMeal();
}
public dismiss(): void {
this.viewCtrl.dismiss();
}
public get meal(): MealRecord {
return {
title: this.form.value.title,
carbs: parseInt(this.form.value.carbs),
details: this.form.value.details,
calories: parseInt(this.form.value.calories),
fat: parseInt(this.form.value.fat),
protein: parseInt(this.form.value.protein),
timestamp: this.params.data.timestamp
};
}
public editRecord(e): void {
e.preventDefault();
if (!this.form.valid) {
return;
}
this.mealsService.editMeal(this.meal);
this.viewCtrl.dismiss();
}
private setMeal(meal: any = this.params.data): void {
if (!meal) {
this.dismiss();
return;
}
this.form.patchValue({ title: meal.title });
this.form.patchValue({ details: meal.details });
this.form.patchValue({ carbs: meal.carbs || meal.count });
this.form.patchValue({ fat: meal.fat });
this.form.patchValue({ calories: meal.calories });
this.form.patchValue({ protein: meal.protein });
}
}
EditMealModal.html:
<ion-header>
<ion-toolbar>
<ion-title>
Edit Meal
</ion-title>
<ion-buttons start>
<button ion-button (click)="dismiss()">
<span ion-text color="primary" showWhen="ios">Cancel</span>
<ion-icon name="md-close" showWhen="android,windows"></ion-icon>
</button>
</ion-buttons>
</ion-toolbar>
</ion-header>
<ion-content class="edit-meal-page">
<ion-card>
<ion-card-content text-center>
<history-macro [item]="meal"></history-macro>
</ion-card-content>
</ion-card>
<ion-card>
<ion-card-content text-center>
Title is required.
</ion-card-content>
</ion-card>
<form class="edit-form" autocomplete="off" novalidate [formGroup]="form">
<ion-list margin-right>
<ion-item class="ios-ion-input-fix">
<ion-label>Title:</ion-label>
<ion-input name="title" type="text" formControlName="title" placeholder="Bacon and Eggs"></ion-input>
</ion-item>
<ion-item>
<ion-label>Carbs:</ion-label>
<ion-input name="carbs" type="number" formControlName="carbs"></ion-input>
</ion-item>
<ion-item>
<ion-label>Fat:</ion-label>
<ion-input name="carbs" type="number" formControlName="fat"></ion-input>
</ion-item>
<ion-item>
<ion-label>Protein:</ion-label>
<ion-input name="carbs" type="number" formControlName="protein"></ion-input>
</ion-item>
<ion-item>
<ion-label>Calories:</ion-label>
<ion-input name="calories" type="number" formControlName="calories"></ion-input>
</ion-item>
<ion-item class="ion-input-fix">
<ion-label>Details:</ion-label>
<ion-input name="details" type="text" formControlName="details" placeholder="3 pieces of bacon, 2 eggs"></ion-input>
</ion-item>
</ion-list>
<div padding>
<button ion-button block type="submit" (click)="editRecord($event)">Save Changes</button>
</div>
</form>
</ion-content>
我已多次阅读文档,但我仍然无法理解。希望有人可以提供帮助!
我得到的错误是:
Can't bind to 'item' since it isn't a known property of 'history-macro'.
1. If 'history-macro' is an Angular component and it has 'item' input, then verify that it is part of this module.
2. If 'history-macro' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.
3. To allow any property add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component. ("
<ion-card>
<ion-card-content text-center>
<history-macro [ERROR ->][item]="meal"></history-macro>
</ion-card-content>
</ion-card>
"): ng:///EditMealModalModule/EditMealModal.html@18:21
'history-macro' is not a known element:
1. If 'history-macro' is an Angular component, then verify that it is part of this module.
2. If 'history-macro' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message. ("
<ion-card>
<ion-card-content text-center>
[ERROR ->]<history-macro [item]="meal"></history-macro>
</ion-card-content>
</ion-card>
答案 0 :(得分:0)
如错误信息中所述,您似乎在history-macro
部分中调用了EditMealModalModule
。但是history-macro
属于AppModule
,您必须创建SharedModule
拥有history-macro
并将SharedModule
导入EditMealModalModule
。
添加强>
Submodules
可以通过导入目标components
来分享他们的submodule
。
参考此live plunker。
答案 1 :(得分:0)
只需将<history-macro [item]="meal"></history-macro>
更改为<history-macro [attr.item]="meal"></history-macro>
,因为item
不是知情产品,应该声明为属性。