2016-06-23 6 views
1

У меня есть угловое приложение, и после некоторых последних рефакторов я получаю новое загадочное сообщение об ошибке, которое я не могу понять.Угловой 2 (RC1) не может прочитать свойство isSkipSelf из null

EXCEPTION: Error: Uncaught (in promise): TypeError: Cannot read property 'isSkipSelf' of null

Эта ошибка стала возникать, когда я установил тип переменной к услуге (ProductMeshGradientService) в конструкторе. Если я удалю ссылку в конструкторе, то приложение работает так, как ожидалось.

Подвели код:

службы, которая нарушаетПримечания: Я не используя productMeshGradientService вообще в настоящее время для отладки причин. Поэтому я могу подтвердить, что ошибка не связана с использованием службы, а вызвана просто установкой переменной в тип службы. Ни проблемы, ни Http, ни ProductImageTextureServices.

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. 
} 

служба, которая импортируется (сокращенное) Примечания: Этот файл, имеющая очень похожие проблемы в том, что если удалить переменные создаются в конструкторе, то ошибка уходит. Единственное различие в этом файле мне нужно удалить и productService, и productCanvasService.

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. 
} 

ответ

0

Эта ошибка обычно возникает при доступе к члену класса Component в template посредством интерполяции, в случае, если этот элемент является недействительным.

В общем, ничего общего с Service, но Component вопрос.

Update: Посмотрите на то, как {{ object.isSkipSelf }}

object может быть что угодно: объект, вызов функции, поле другого объекта.

Вы должны изменить его {{ object?.isSkipSelf }}

Это называется оператор Элвисаhttps://en.wikipedia.org/wiki/Elvis_operator#Angular2

+0

Не могли бы вы привести пример того, как это может выглядеть? У нас довольно много контроллеров, и я не уверен, где искать, поскольку единственный раз, когда я получаю эту ошибку, - это ответ на редактирование службы. – efarley

+0

обновлен с информацией о 'elvis operator' –

0

Эта ошибка сообщается в угловом репо: https://github.com/angular/angular/issues/9332

Проблема вызвана неопределенными значениями, вводятся в записи конструктора или директив/поставщиков аннотации компонента.

В неопределенных значениях вызваны импортом, постановляет undefined вследствие barrel ordering issues или действительного circular dependencies

Похоже, вы просто не хватаете импорт из ProductImageTextureService в вашем TextureService модуля.

Однако вы говорите, что проблема связана с ProductMeshGradientService. Я бы отлаживал это в chrome, установив точку останова на линиях export class ... и посмотрев, каково значение этих импортированных модулей.Если они не определены, тогда возникает проблема с загрузкой этого модуля.

Вы также можете попробовать обновить до RC3, поскольку я полагаю, что проблема, упомянутая выше, исправлена ​​в этой версии, она должна обеспечить более четкое сообщение об ошибке.

+0

Обновление rc3 дало мне гораздо более описательную ошибку, но я все еще немного потерял. Похоже, что он говорит, что он не может решить 4-ю передачу, переданную моему конструктору, но я не уверен, почему она не может ее решить. Я включил его в свой импорт. ИСКЛЮЧЕНИЕ: Не удается разрешить все параметры для ProductDropService: (ProductClickedObjectService, ProductColorService, ProductGradientTextureService,?, ModelThreeDService). – efarley

+0

Одна вещь, которую я рассматривал как причина, заключается в том, что у меня есть служба A, которая импортирует услугу B, которая импортирует услугу C, которая импортирует услугу A, создающую циклическую зависимость – efarley

+0

@efarley Действительно, действительная циклическая зависимость приведет к неопределенному значению. Я бы рекомендовал рефакторинг ваших услуг, чтобы устранить зависимость, но быстрое исправление будет заключаться в использовании [forwardRef] (https://angular.io/docs/ts/latest/cookbook/dependency-injection.html#!#forwardref) – Michael

0

Я думаю, что проблема из-за циклическую зависимость пожалуйста, перейдите по ссылке ниже для более подробной информации о Circular Dependency

И попытаться избежать этого в вашем коде, то вы не получите эту ошибку.