【问题标题】:Dependency injection Angular 2依赖注入Angular 2
【发布时间】:2017-12-13 17:14:39
【问题描述】:

我正在尝试向我的组件注入服务,但我不断收到错误消息。

这是我的组件:

import {Component, View} from 'angular2/angular2';
import {DisplayService} from '../../services/DisplayService';

@Component({
  selector: 'display'
})
@View({
  templateUrl: './components/display/display.html',
  styleUrls: ['./components/display/display.css']
})
export class Display {
  displays: Array<any>;

  constructor(public displayService: DisplayService){

  }
}

这是我的服务:

import {HTTP_BINDINGS, Http} from 'http/http';

export class DisplayService {
    displays: Array<any>;

    constructor(public http: Http){

    }

    getDisplays() {
        var path = 'http://localhost:8000/get';
        this.http.get(path)
    }
}

这是我的主要组件:

import {Component, View, bootstrap} from 'angular2/angular2';
import {HTTP_BINDINGS, Http} from 'angular2/http';

import {DisplayService} from './services/DisplayService';

@Component({
  selector: 'app',
  viewBindings: [DisplayService]
})
@View({
  templateUrl: './app.html',
  styleUrls: ['./app.css']
})
class App {}

bootstrap(App, [ROUTER_BINDINGS, HTTP_BINDINGS]);

EXCEPTION: Error during instantiation of Token(Promise<ComponentRef>)!.

ORIGINAL EXCEPTION: Cannot resolve all parameters for DisplayService(?). Make sure they all have valid type or annotations.

当我将服务注入组件时,我尝试传入Http 包,但也只是抛出了一个错误。

【问题讨论】:

标签: javascript angular


【解决方案1】:

在阅读了@EricMartinez 在 cmets 中提供的文章后,我意识到出了什么问题,因为服务类非常简单,它不会产生 di 框架工作所需的元数据。所以这是我的代码现在的样子:

组件:

import {Component, View, NgFor} from 'angular2/angular2';

import {Subbar} from '../subbar/subbar';
import {DisplayCard} from '../display-card/display-card';

import {DisplayService} from '../../services/display_service';

@Component({
  selector: 'display'
})
@View({
  templateUrl: './components/display/display.html',
  styleUrls: ['./components/display/display.css'],
  directives: [Subbar, DisplayCard, NgFor]
})
export class Display {
    displays: Array<any>;

    constructor(public displayService: DisplayService){
        displayService.getDisplays()
            .toRx()
            .map(res => res.json())
            .subscribe(displays => this.displays = displays.screens);
    }
}

服务:

import {Http} from 'angular2/http';
import {Injectable} from 'angular2/di';

@Injectable()
export class DisplayService {
    constructor(public http: Http){

    }

    getDisplays() {
        var path = 'http://localhost:8000/getscreens';
        return this.http.get(path);
    }
}

如您所见,添加 @Injectable() 会强制生成元数据。设置服务的另一个选项是这样做:

import {Http} from 'angular2/http';
import {Inject} from 'angular2/di';

export class DisplayService {
    constructor(@Inject(Http) http: Http){

    }

    getDisplays() {
        var path = 'http://localhost:8000/getscreens';
        return this.http.get(path);
    }
}

这取决于我的口味,我刚刚找到了第一种更清洁的方法。

【讨论】:

    【解决方案2】:

    你必须导入

    import {Injectable} from 'angular2/core';
    

    到您的服务中并将@Injectable 注解放在DisplayService 的顶部。

    最后是将DisplayService放入bootstrap绑定参数中。

    【讨论】:

      猜你喜欢
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 2015-11-08
      • 1970-01-01
      • 2016-10-23
      • 2016-07-19
      相关资源
      最近更新 更多