当前位置: 首页 > 面试题库 >

Angular2异常:没有服务提供者

羊舌子瑜
2023-03-14
问题内容

当我有嵌套在根组件下的组件时,我无法实例化我的应用程序,该组件providing在其构造函数中使用。

import {Component, Injectable} from 'angular2/core';


@Component()
export class GrandChild(){
  constructor () {
    this.hello = "hey!"
  }
}

@Component({
  providers: [GrandChild]
})
@Injectable()
export class Child {
    constructor(public grandchild: GrandChild) {
        this.grandchild = grandchild;
    }
}

@Component({
    providers: [Child],
    template: `Everything rendered fine!`,
    selector: 'app'
})

export class App {
    kid: Child;

    constructor(public child: Child) {
        this.kid = child;
    }
}

EXCEPTION: No provider for GrandChild! (App -> Child -> GrandChild)

我想知道为什么这种行为是非法的。假设我想在GrandChild班级中使用该类,Child而只是在Child班级中引用App该类。这似乎是不可能的。

创建provide层次结构的正确方法是什么?

谢谢你

PLNKR:http
://plnkr.co/edit/5Z0QMAEyZNUAotZ6r7Yi?p=preview


问题答案:

您可以直接将父组件注入到组件中,而无需将其指定到组件提供程序中。为此,您需要在其他组件中使用组件并将其设置为directives属性:

@Component({
  selector: 'child',
  template: `
    <div></div>
  `
})
export class Child {
  constructor(@Inject(forwardRef(() => App)) parent: App) {
  }
}

@Component({
  directives: [Child],
  template: `
    Everything rendered fine!
    <child></child>
  `,
  selector: 'app'
})
export class App {
  constructor() {
  }
}

你是什么样的一个有点奇怪的是,你没有界定selectortemplate对组件的属性ChildGrandChild。它们真的是组成部分吗?

在您的样本中,您以错误的方式制作东西。如果要从父组件获取子组件的实例,则需要利用@ViewChild装饰器通过注入从父组件引用子组件:

import { Component, ViewChild } from 'angular2/core';

(...)

@Component({
  selector: 'my-app',
  template: `
    <h1>My First Angular 2 App</h1>
    <child></child>
    <button (click)="submit()">Submit</button>
  `,
  directives:[App]
})
export class AppComponent { 
  @ViewChild(SearchBar) searchBar:SearchBar;

  (...)

  someOtherMethod() {
    this.searchBar.someMethod();
  }
}

这是更新的plunkr:http
://plnkr.co/edit/mrVK2j3hJQ04n8vlXLXt?p=preview 。

您会注意到,@Query也可以使用参数装饰器:

export class AppComponent { 
  constructor(@Query(SearchBar) children:QueryList<SearchBar>) {
    this.childcmp = children.first();
  }

  (...)
}

您会注意到,@Injectable拥有装饰器时,您不需要装饰器@Component



 类似资料:
  • 我已经用头撞了两天了。我试图在Angular2 beta0.0.2中实现一些简单的路由。请注意,我使用的是打字稿。 所以我所理解的是,我需要用ROUTER_PROVIDERS引导我的根应用程序组件,以便这些服务对我的世卫组织应用程序可用,并为想要实现ROUTER_DIRECTIVES路由的组件设置指令。 这是我所拥有的: angular应用程序加载并显示模板,但链接无效,我的控制台出现以下错误:

  • 我构建了一个Angular,它有自己的服务和组件: 和: 然后我将其导入我的: 当我将注入时,出现错误: 应用程序组件中的错误:文件服务没有提供程序 来自Angular文档: 当我们导入模块时,Angular 会将模块的服务提供程序(其提供程序列表的内容)添加到应用程序根注入器中。 这使得应用程序中知道提供者的查找标记的每个类都可以看到提供者。 我做这件事缺少什么?

  • {java.io.ioException:SERVICE_NOT_AVAILABLE at system.runtime.exceptionservices.exceptiondispatchinfo.throw()[0x0000c]in/src/mono.android/src/runtime/jnienv.g.cs:195 at android.gms.gcm.iid.instanceId.g

  • 简介 服务提供者是所有 Lumen 应用程序启动的中心所在。包括你自己的应用程序,以及所有的 Lumen 核心服务,都是通过服务提供者启动的。 但是,我们所说的「启动」指的是什么?一般而言,我们指的是 注册 事物,包括注册服务容器绑定、事件侦听器、中间件,甚至路由。服务提供者是设置你的应用程序的中心所在。 若你打开 Lumen 的 bootstrap/app.php 文件,你将会看到 $app->

  • 服务提供者是组件和CatLib联系的桥梁。同时也是CatLib启动的中心,所有的服务都是通过服务提供者定义的。 名词定义 组件 组件与CatLib没有任何关系,她们可以独立的运行在不同的框架中。 服务 是由服务提供者将由一个或者多个组件组合而成,并提供一组可以被开发者使用的接口。 容器 CatLib 依赖注入容器。 架构图 创建服务提供者 服务提供者是用来描述一个服务如何为使用者提供服务的,这些关