【问题标题】:EXCEPTION: UnCaught (in Promise). Injectioned Service in Angular 2例外:未捕获(在 Promise 中)。 Angular 2 中的注入服务
【发布时间】:2017-06-05 11:46:14
【问题描述】:

我无法渲染 Angular 的组件,我也想不通。

这与调用服务注入数据的方法有关。它正在返回以下错误消息:

例外:未捕获(承诺中)

这是我的相关代码:

cartelera-list.component.ts

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

import { CarteleraService } from './cartelera.service';
import { Pelicula } from './pelicula.model';

@Component({
  selector: 'cartelera-list',
  template: `
  <ul>
    <li *ngFor="let pelicula of cartelera"> 
        <p>+++ {{ pelicula.titulo }} - {{ pelicula.genero }} - {{ pelicula.duracion }} </p>
    </li>
  </ul>
  `,
  providers: [CarteleraService]
})

    export class CarteleraListComponent implements OnInit {

    public cartelera: Pelicula[];

    contructor(private carteleraService: CarteleraService) {}

    getPeliculas(): void {
        this.carteleraService.getPeliculas().then((cartelera: Pelicula[]) => this.cartelera = cartelera);
    }

    ngOnInit(): void {
        this.getPeliculas();
    }

}

cartelera.service.ts

import { Injectable } from '@angular/core';

import { Pelicula } from './pelicula.model';
import { CARTELERA } from './pelicula-data';

@Injectable()
export class CarteleraService {
    getPeliculas(): Promise<Pelicula[]> {
        return Promise.resolve(CARTELERA);
    }
}

服务返回的参数 CARTELERA 只是一个由 Pelicula 列表(接口 - 模型)组成的 const 化合物。

注意:完整消息的错误是:

例外:未捕获(在承诺中) 无法读取未定义错误的属性“getPeliculas”。

注意:这句话我之前试过

contructor(private carteleraService: CarteleraService) {}

但是,当我使用它时,会在编译时出现下一个错误。

app.module.ts

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule }    from '@angular/forms';
import { AppComponent }   from './app.component';

import { routing } from './app.routing';

import { SociosComponent } from './socios.component';
import { Index } from './index';
import { CarteleraComponent } from './cartelera.component';
import { CarteleraListComponent } from './cartelera-list.component';


@NgModule({
  imports:      [ 
    BrowserModule,
    FormsModule,
    routing    
  ],
  declarations: [ 
    AppComponent,
    SociosComponent,
    Index,
    CarteleraComponent,
    CarteleraListComponent
  ],
  bootstrap:    [ AppComponent ]
})

export class AppModule {}

【问题讨论】:

  • 请检查我的附加说明。 @echonax
  • 请检查我的附加说明。 @AJT_82
  • 无论如何,从该组件所属的模块“提供”服务(如果您使用的是功能模块,则为“应用程序”或其他任何内容)。否则做同样的事情(使用正确的构造函数配置)。走着瞧吧。就应用程序架构/模式而言,我倾向于从模块提供和组件消耗的角度来考虑,可用的示例等似乎证明了这一点。我不确定我是否曾尝试从组件“提供”服务,我什至不确定组件是否可以(或应该)为自己“提供”服务。
  • 哦,顺便说一句,Angular 2 对几乎所有东西都说“承诺错误”之类的东西,并用可怕的红色呕吐物加载你的控制台,这通常让人很难发现问题是这样简单的元素名称或其他内容中的拼写错误。
  • 我的英语不够好,但如果我能听懂你的话……太粗鲁了……:S

标签: angular


【解决方案1】:

Echonax 几乎是正确的。除了 echonax 建议的更改之外,您还有一个错字:

contructor(private carteleraService: CarteleraService) {}

应该是constructor,所以你错过了s

作为旁注,我将从您的 cartelera-list.component 中删除 providers: [CarteleraService],并在您的 NgModule 中将其声明为提供者:

providers: [CarteleraService]

这使得该服务在整个模块中可用,因此您无需在所需的所有组件中导入和声明它。只是一个建议! ;)

【讨论】:

  • 好吧,我能说什么?你又@AJT_82 !!??大声笑,谢谢伙计... :) :) :)。干杯;)
【解决方案2】:

改变

private carteleraService: CarteleraService;

contructor(carteleraService) {}

contructor(private carteleraService: CarteleraService) {}

这样,Angular DI 会将CarteleraService 注入到您的this.carteleraService

【讨论】:

  • 请检查我的附加说明。
  • @EliasMP 您是否从您的字段中删除了private carteleraService: CarteleraService;?它应该只存在于构造函数中。
  • 我做到了...检查一下。谢谢:)
  • 对不起我的礼貌......我的英语不够好......如果你愿意,请查看我编辑的帖子。如果您需要更多东西,请告诉我。非常感谢您浪费时间帮助我。谢谢@echonax :)
  • @EliasMP 完全没问题,先生,我正试图找出问题所在,但找不到任何东西:(
【解决方案3】:

尝试使用以下方式手动编写promise

@Injectable()
export class CarteleraService {
    getPeliculas(): Promise<Pelicula[]> {

return new Promise((resolve, reject) => {
    resolve(CARTELERA);
  });
 }
}

您没有以正确的方式定义承诺。尝试控制台记录 getPeliculas 方法在服务中自行验证

【讨论】:

  • 谢谢。我没有尝试这种方法。我会在周末做,让大家知道。队友的欢呼声 :) :)。但是正如@echonax 所说,我在尝试以标准方式定义服务属性时遇到问题。我的解决方案是在承包商之外的私有财产中定义服务。我想知道,如果它是正确的......
  • 您在providers 数组中提到了服务+ 正确导入它。在构造函数中初始化也是正确的。只需尝试contructor(private carteleraService: CarteleraService) { console.log(this.carteleraService); } 来检查返回的服务。
  • 是的,即使我用这种方式做了一些工作演示,但我现在失去了一些东西。我不知道是什么。我也无法访问 console.log。当我启动 tsc -p front 时,我收到了错误...
  • 嗨@candidJ。刚刚尝试了您的代码,但我仍然无法编译文件。 tsc -p front,返回我帖子中发布的错误...:S。谢谢大佬。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 2017-08-14
  • 2020-12-10
  • 2016-09-23
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
相关资源
最近更新 更多