Angular 2(RC1)无法读取属性'isSkipSelf'的null

时间:2016-06-23 18:47:05

标签: angular

我有一个有角度的应用程序,经过一些最近的重构后,我得到了一个我无法弄清楚的新的神秘错误消息。

  

EXCEPTION:错误:未捕获(在承诺中):TypeError:无法读取属性'isSkipSelf'为null

当我在构造函数中将变量类型设置为服务( ProductMeshGradientService )时,会发生此错误。如果我删除构造函数中的引用,那么应用程序将按预期工作。

总结代码:

正在破解的服务 注意:由于调试原因,我目前没有使用productMeshGradientService。所以我可以确认错误与使用服务无关,但是只是将变量设置为服务类型。 HttpProductImageTextureServices都不会导致任何问题。

import {
  Injectable,
  EventEmitter
} from '@angular/core';
import {
  Http,
  Response
} from '@angular/http';

import { ProductMeshGradientService } from '../../services/product.mesh-gradient/product.mesh-gradient.service';

@Injectable()
export class TextureService {
    constructor( 
        private http: Http,
        private productMeshGradientService: ProductMeshGradientService ,
        private productImageTextureService: ProductImageTextureService) { }
    // Some methods are here.
}

正在导入的服务(缩写)注意:此文件有非常类似的问题,如果我删除在构造函数中设置的变量,则错误发生远。唯一的区别是在此文件中我需要删除productServiceproductCanvasService

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

import { ProductService } from '../product/product.service';
import { ProductDropService } from '../product.drop/product.drop.service';
import { ProductCanvasService } from '../product.canvas/product.canvas.service';

@Injectable()
export class ProductMeshGradientService {
  constructor ( private productService: ProductService,
                private productCanvasService: ProductCanvasService ) {
  }

  // Some methods live here.
}

7 个答案:

答案 0 :(得分:3)

角度回购中报告了此错误:https://github.com/angular/angular/issues/9332

问题是由组件注释的构造函数或指令/提供程序条目中注入的未定义值引起的。

未定义的值是由barrel ordering issues或有效circular dependencies

解析为undefined的导入引起的

您似乎只是错过了ProductImageTextureService模块中TextureService的导入。

但是,您说问题出在ProductMeshGradientService上。我在chrome中对此进行调试,在export class ...行设置断点,并查看这些导入模块的值。如果它们未定义,则加载该模块时会出现问题。

您也可以尝试更新到RC3,因为我相信上面引用的问题在该版本中得到修复,它应该提供更清晰的错误消息。

答案 1 :(得分:1)

如果您通过插值访问Component中的template的类成员,以防此成员为空,则通常会出现此错误。

基本上与Service无关,而与Component问题无关。

<强>更新: 寻找像{{ object.isSkipSelf }}

这样的东西

object可以是任何东西:对象,函数调用,另一个对象的字段。

您必须将其更改为{{ object?.isSkipSelf }}

这称为 elvis operator https://en.wikipedia.org/wiki/Elvis_operator#Angular2

答案 2 :(得分:0)

我认为问题是由于循环依赖性,请通过以下链接了解有关Circular Dependency的更多详情

并尝试在代码中避免这种情况,然后您就不会收到此错误。

答案 3 :(得分:0)

在某些情况下,这是由 Angular Language Service 扩展引起的。您可以禁用扩展并重新加载工作空间以进行验证。

答案 4 :(得分:0)

当我忘记检入包含Injectable服务的文件时,出现了此错误。本地没有问题,但是在构建服务器上出现此错误。在这种情况下,您会希望得到更多描述性的信息。

答案 5 :(得分:0)

矿山根本不是技术答案。这就是帮助我的原因,我不能保证它会帮助您。但是尝试并不会有伤害。 我只是做了“ npm install”,然后重新启动了VS代码。那自动为我解决了这个问题。 就我而言,其他答案不适用。我所做的唯一更改是对html文件。我在html文件中而不是ts文件中遇到此错误。因此,没有错误的导入或构造函数中无效值之类的问题。

答案 6 :(得分:0)

成立的两个原因:

首次输入错误:

Just run on the same error
turns out I had error inside one of my custom components, it was mistake in import statement in TS file

after fixing the component TS import, the template error was gone

it would be nice to have better error message in this case 

第二语言服务扩展:

I disabled/reloaded and enabled/reloaded Angular Language Service and the error disappeared

链接:github