我想自定义我的应用程序视图,由服务中的事件触发.

我的一项服务注入了ChangeDetectorRef.编译工作正常,但当应用程序启动时,浏览器中出现了一个错误:No provider for ChangeDetectorRef!.

我想我需要将它添加到我的AppModule中,但我找不到任何文档表明它位于我可以导入的模块中.我试图将类本身添加到导入数组中,但这导致了一个错误.我在try 将其添加到模块中的providers数组时也遇到了一个错误.以下是我的服务的简化版本:

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

@Injectable()
export class MyService {
  private count: number = 0;
  constructor(private ref: ChangeDetectorRef){}

  increment() {
    this.count++;
    this.ref.detectChanges();
}

以及应用程序模块:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { MyService } from './my.service';

@NgModule({
  imports: [ BrowserModule ],
  declarations: [ AppComponent ],
  providers: [ MyService ],
  booststrap: [ AppComponent ]
})
export AppModule {}

UPDATE

之后,我try 删除对ChangeDetectorRef的使用,但仍然存在同样的问题.我猜我更新系统JS配置的方式有问题罢工>

我最初用angular cli创建了这个应用程序,并试图自己更新angular,因为他们没有更新.随着Angular 2.0.0的最终发布,他们更新了Angular cli,以使用Angular的最新版本.所以我将try 使用他们的升级程序,希望情况会更好.

Update 2

网页包/客户端更新进展顺利.我现在有了Angular 2.0.0英寸和Angular cli 1.0.0-beta14的应用程序构建.我在浏览器中仍然会遇到同样的错误.我试着从服务中删除ChangeDetectorRef,但我真的没有.我分两次使用.如果我从这两个服务中删除它,那么我的应用程序加载良好,运行良好,但我try 使用ChangeDetectorRef的地方除外.一旦我将其添加回其中一个文件中,浏览器就会抱怨无法为其找到Provider .

我试着把它放进我的module,但它不是module,所以运输员抱怨道.我试着在我的模块中将其列为a provider,但它没有提供属性,因此transpiler抱怨.如果我试着把它放到declarations数组中,也会遇到类似的问题.

推荐答案

ChangeDetectorRef不是这里使用的选项.它正在寻找给定组件及其子组件中的更改.

在您的情况下,最好使用ApplicationRef:

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

@Injectable()
export class MyService {
  private count: number = 0;
  constructor(private ref: ApplicationRef) {}

  increment() {
    this.count++;
    this.ref.tick();
  }
}

我用Observables判断了这个解决方案,它可以正常工作:

import { ApplicationRef, Injectable } from '@angular/core';
import { Observable, ReplaySubject } from "rxjs/Rx";
import * as childProcess from 'child_process';

@Injectable()
export class Reader {

    private output: ReplaySubject<string> = new ReplaySubject<string>(0);

    constructor(private ref: ApplicationRef) {
        var readerProcess = childProcess.spawn('some-process');
        readerProcess.stdout.on('data', (data) => {
            this.output.next(data.toString());
            this.ref.tick();
        });
    }

    public getOutput():Observable<string> {
        return this.output;
    }
}

下面是一个使用它的组件:

import {Component} from '@angular/core';
import { ReplaySubject, Observable } from "rxjs/Rx";

import { Reader } from './reader/reader.service';

@Component({
    selector: 'app',
    template: `
    output:
    <div>{{output}}</div>
    `
})
export class App {

    public output: string;

    constructor(private reader: Reader) {}

    ngOnInit () {
        this.reader.getOutput().subscribe((val : string) => {
            this.output = val;
        });
    }
}

Typescript相关问答推荐

为什么AB和CD这两种类型在TypScript中可以相互分配?

返回对象的TypScript构造函数隐式地替换This的值来替换super(.)的任何调用者?

使用FormArray在Angular中添加排序

使用前的组件渲染状态更新

无法将select选项的值设置为ngFor循环中的第一个元素

创建一个根据布尔参数返回类型的异步函数

如何使用泛型自动推断TS中的类型

如何将所有props传递给React中的组件?

适当限制泛型函数中的记录

如何在react组件中使用doctype和html标签?

有没有可能产生输出T,它在视觉上省略了T中的一些键?

Fp-ts使用任务的最佳方法包装选项

尽管对象的类型已声明,但未解析的变量<;变量

正确使用相交类型的打字集

17个Angular 的延迟观察.如何在模板中转义@符号?

如何解决&Quot;类型不可分配给TypeScrip IF语句中的类型&Quot;?

TypeScrip:如何缩小具有联合类型属性的对象

在Vite中将SVG导入为ReactComponent-不明确的间接导出:ReactComponent

传入类型参数<;T>;变容函数

如何通过nx找到所有受影响的项目?