How to fix ERROR TypeError: "_co.loadedRecipe is undefined", ERROR Error: "[object Object]"

How to fix ERROR TypeError: "_co.loadedRecipe is undefined", ERROR Error: "[object Object]"

我正在学习 ionic/angular 并且正在尝试使用路由的东西,信息通过这样的路径传递

path: ':recipeId',

因为我有一个带有 ID 的项目列表,所以我希望能够单击该项目并转到该列表项目的详细信息页面。

我成功地显示了带有项目列表的页面(可以说它在 /recipes)但是当我点击一个项目进入详细信息页面时(/recipes/id)我出错了:

ERROR TypeError: "_co.loadedRecipe is undefined" View_RecipeDetailPage_0 RecipeDetailPage.html:11 Angular 24 RxJS 5 Angular 11 RecipeDetailPage.html:11:4 View_RecipeDetailPage_0 RecipeDetailPage.html:11 Angular 16 RxJS 5 Angular 11

这指向模块(或组件?angular 的新功能)html 代码

<ion-header>
  <ion-toolbar>
    <ion-title> {{ loadedRecipe.title }} </ion-title>
  </ion-toolbar>
</ion-header>

<ion-content>
    <ion-grid>
        <ion-row>
            <ion-col>
                <ion-img [src]="loadedRecipe.imageUrl"></ion-img>
            </ion-col>
        </ion-row>
        <ion-row>
            <ion-col>
                <h1> {{ loadedRecipe.title }}</h1>
            </ion-col>
        </ion-row>
        <ion-row>
            <ion-col>
                <ion-list>
                    <ion-item *ngFor="let ig of loadedRecipe.ingredients">
                        {{ ig }}
                    </ion-item>
                </ion-list>
            </ion-col>
        </ion-row>
    </ion-grid>
</ion-content>

这里的 loadedRecipe 似乎是 undefined

Here's the controller ts code:

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { RecipesService } from '../recipes.service';

import { Recipe } from '../recipe.model';

@Component({
  selector: 'app-recipe-detail',
  templateUrl: './recipe-detail.page.html',
  styleUrls: ['./recipe-detail.page.scss'],
})
export class RecipeDetailPage implements OnInit {

  loadedRecipe: Recipe;

  constructor(
    private activatedRoute: ActivatedRoute,
    private recipesService: RecipesService
  ) {}

  ngOnInit() {
    console.log(this.activatedRoute.paramMap);
    this.activatedRoute.paramMap.subscribe(paramMap => {
        if (!paramMap.has('recipeId')) {
            // redirect because we don't have id that we need
            return;
        }

        console.log(paramMap);
        const recipeId = paramMap.get('recipeId');
        this.loadedRecipe = this.recipesService.getRecipe(recipeId);
    });
  }

}

app-routing module:

import { NgModule } from '@angular/core';
import { PreloadAllModules, RouterModule, Routes } from '@angular/router';

const routes: Routes = [
  { path: '', redirectTo: 'recipes', pathMatch: 'full' },
  {
    path: 'recipes',
    children: [
    {
      path: '',
      loadChildren: './recipes/recipes.module#RecipesPageModule'
    },
    {
      path: ':recipeId',
      loadChildren: './recipes/recipe-detail/recipe-detail.module#RecipeDetailPageModule'
    }
    ],
  }
];

@NgModule({
  imports: [
    RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
  ],
  exports: [RouterModule]
})
export class AppRoutingModule { }

list controller recipes.page.ts:

import { Component, OnInit } from '@angular/core';
import { RecipesService } from './recipes.service';
import { Recipe } from './recipe.model';

@Component({
  selector: 'app-recipes',
  templateUrl: './recipes.page.html',
  styleUrls: ['./recipes.page.scss'],
})
export class RecipesPage implements OnInit {

  recipes: Recipe[];


  constructor(private recipesService: RecipesService) { }

  ngOnInit() {
    this.recipes = this.recipesService.getAllRecipes();
  }

}

我想我在激活的路线上做错了什么,但我有点不知所措。在网络上调试也是新手,所以任何指针都会很棒。

Nicholas K 让您朝着正确的方向前进。我想一个例子也会有所帮助。

app-routing.module.ts

 import { NgModule } from '@angular/core';
 import { PreloadAllModules, RouterModule, Routes } from '@angular/router';

 const routes: Routes = [
   { path: '', redirectTo: 'recipes', pathMatch: 'full' },
   { path: 'recipes', loadChildren: './recipes/recipes.module#RecipesPageModule' },
   { path: 'recipe-detail/:id', loadChildren: './recipe-detail/recipe-detail.module#RecipeDetailPageModule' },
 ];

 @NgModule({
   imports: [
     RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
   ],
   exports: [RouterModule]
 })
 export class AppRoutingModule { }

在 recipe-detail.page.ts 中,正如 Nicholas K 提到的,您可以像这样访问激活路由中的参数

 ngOnInit() {
   this.id = this.route.snapshot.paramMap.get("id");
   if (this.id != null) {
     console.log('id: ' + this.id);
   }
 }

而且你可以像这样从菜谱页面导航到详情页面(你也可以使用 routerLink 而不是点击事件来导航)

recipes.page.html

 <ion-content>
   <ion-list>
     <ion-item *ngFor="let recipe of recipes" (click)="routeToRecipeDetail(recipe.id)">
       {{recipe.name}}
     </ion-item>
   </ion-list>
 </ion-content>

食谱。page.ts

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

 @Component({
   selector: 'app-recipes',
   templateUrl: './recipes.page.html',
   styleUrls: ['./recipes.page.scss'],
 })
 export class RecipesPage implements OnInit {

   recipes = [
     { id: 1, name: 'pizza' },
     { id: 2, name: 'hamburgers' },
     { id: 3, name: 'salad' }
   ]

   constructor(private router: Router) { }

   ngOnInit() {
   }

   routeToRecipeDetail(id: number) {
     this.router.navigateByUrl('/recipe-detail/' + id);
   }

 }

我创建了一个 github 存储库 here 如果你想看一看。 希望这有帮助