Я создал базовое приложение в Angular 2, но столкнулся со странной проблемой, когда я не могу внедрить службу в один из моих компонентов. Тем не менее, он отлично вписывается в любой из трех других компонентов, которые я создал.
Для начала, это сервис:
import { Injectable } from '@angular/core';
@Injectable()
export class MobileService {
screenWidth: number;
screenHeight: number;
constructor() {
this.screenWidth = window.outerWidth;
this.screenHeight = window.outerHeight;
window.addEventListener("resize", this.onWindowResize.bind(this) )
}
onWindowResize(ev: Event) {
var win = (ev.currentTarget as Window);
this.screenWidth = win.outerWidth;
this.screenHeight = win.outerHeight;
}
}
И компонент, с которым он отказывается работать:
import { Component, } from '@angular/core';
import { NgClass } from '@angular/common';
import { ROUTER_DIRECTIVES } from '@angular/router';
import {MobileService} from '../';
@Component({
moduleId: module.id,
selector: 'pm-header',
templateUrl: 'header.component.html',
styleUrls: ['header.component.css'],
directives: [ROUTER_DIRECTIVES, NgClass],
})
export class HeaderComponent {
mobileNav: boolean = false;
constructor(public ms: MobileService) {
console.log(ms);
}
}
Я получаю ошибку в консоли браузера:
ИСКЛЮЧЕНИЕ: Не удается разрешить все параметры для HeaderComponent: (?).
У меня есть сервис в функции начальной загрузки, поэтому у него есть провайдер. И мне кажется, что я могу внедрить его в конструктор любого из моих других компонентов без проблем.
angular
angular2-di
Кит Отто
источник
источник
'../'
лиindex.ts
(баррель)? Можете ли вы попробовать импортировать его из файла, в котором он объявлен напрямую?Ответы:
Импортируйте его из файла, в котором он объявлен напрямую, а не в бочку.
Я не знаю, что именно вызывает проблему, но я видел, что она упоминалась несколько раз (возможно, какая-то круговая зависимость).
Это также должно быть исправлено путем изменения порядка экспорта в бочке (не знаю деталей, но также упоминалось)
источник
2.0.2
). Я нахожу бочки все еще полезными, особенно когда мне нужно импортировать несколько моделей и сервисов между различными модулями. Этоimport { cleanValues, getState, FirebaseService, NotificationService, ... } from '../../shared/services';
было болью, когда это не сработало (NgModule
не помогает синглтон-сервис ...В дополнение к предыдущим ответам кажется, что эта ошибка также генерируется, когда в вашей инъекционной службе отсутствует фактический
@Injectable()
декоратор. Поэтому, прежде чем отлаживать функцию циклической зависимости и порядок импорта / экспорта, выполните простую проверку, действительно ли определена ваша служба@Injectable()
.Это относится к текущей версии Angular, Angular 2.1.0.
Я открыл вопрос по этому вопросу .
источник
Router
из '@ angular / router', и без этого инъекция эта ошибка всегда будет происходить (как только вы решите сделать одну строку код использует тот@injectable()
не требуется. Что является еще одной странностью для себя. Для хорошей меры я все еще добавил бы это, просто для того, когда вы когда-нибудь решите ввести что-то.Начиная с Angular,
2.2.3
теперь естьforwardRef()
служебная функция, которая позволяет вводить поставщиков, которые еще не определены.Под «не определено» я имею в виду, что карта внедрения зависимостей не знает идентификатора. Это то, что происходит во время циклических зависимостей. У вас могут быть круговые зависимости в Angular, которые очень трудно распутать и увидеть.
Добавление
@Inject(forwardRef(() => MobileService))
к параметру конструктора в исходном коде исходного вопроса решит проблему.Ссылки
Angular 2 Manual: ForwardRef
Форвард ссылки в Angular 2
источник
forwardRef()
был уже в альфе ;-) Это необходимо, только еслиMobile
сервис объявлен ниже в том же файле. Если классы находятся в разных файлах, нет необходимостиforwardRef()
forwardRef()
помог избавиться отCan't resolve all parameters for ...
сообщения. По крайней мере, компонент работает, пока я ищу более подходящее решение проблемы. (И да, ошибочная зависимость импортируется непосредственно из ее файла)forwardRef
. Это очень трудно найти. Вчера у меня ушёл целый день, чтобы решить эту проблему.foreardRef
себя, но не больше после того, какNgModule
был представлен. Я не беспокоюсь о потере повторений. Мне просто любопытно, почему вы столкнулись с этим после того, как это больше не появлялось в течение нескольких месяцев. Я посмотрю поближе, когда вернусь домой через несколько дней. Большое спасибо за отзыв.НЕПРАВИЛЬНО № 1: Забывая декоратор:
НЕПРАВИЛЬНО № 2: Пропуск символа "@":
НЕПРАВИЛЬНО № 3: Пропуск символов "()":
НЕПРАВИЛЬНО № 4: строчная буква «я»:
Ошибка № 5: Вы забыли: импортировать {Injectable} из '@ angular / core';
ПРАВИЛЬНЫЙ:
источник
Как уже говорилось, проблема вызвана экспортным заказом внутри ствола, который вызван круговыми зависимостями.
Более подробное объяснение здесь: https://stackoverflow.com/a/37907696/893630
источник
Я также столкнулся с этим, вводя службу A в службу B и наоборот.
Я думаю, что это хорошо, что это быстро терпит неудачу, так как этого, вероятно, следует избегать в любом случае . Если вы хотите, чтобы ваши услуги были более модульными и могли использоваться повторно, лучше избегать циклических ссылок в максимально возможной степени. Этот пост освещает подводные камни, связанные с этим.
Поэтому у меня есть следующие рекомендации:
EventService
), который оба сервиса могут внедрить для обмена сообщениями.источник
В интересах искателей; Я получил эту ошибку. Это был просто пропущенный символ @.
Т.е. это выдает
Can't resolve all parameters for MyHttpService
ошибку.Добавление отсутствующего
@
символа исправляет это.источник
В моем случае мне нужно было добавить
import "core-js/es7/reflect";
в свое приложение, чтобы сделать@Injectable
работу.источник
Другая возможность - не
emitDecoratorMetadata
устанавливать значение true в tsconfig.json.источник
Эта ошибка появляется, если у вас есть служба A, которая зависит от статического свойства / метода службы B, а сама служба B зависит от службы A через внедрение зависимостей. Так что это своего рода циклическая зависимость, хотя это не так, поскольку свойство / метод является статическим. Вероятно, ошибка, которая возникает в сочетании с AOT .
источник
A -> B
и они оба использовали один и тот же статический класс. Решение с помощьюforwardRef
, но я собираюсь посмотреть, как это можно распутать. Я, вероятно, попытаюсь сделать реальный сервис из этого статического класса (это также приведет к лучшему дизайну).В дополнение к отсутствующему
@Injectable()
декораторуОтсутствие
@Injectable()
декоратора в абстрактном классе привело к невозможности разрешить все параметры для сервиса: (?) Декоратор должен присутствоватьMyService
как в производном классе, так и в немBaseService
источник
В моем случае это произошло потому, что я не объявил тип для параметра конструктора.
У меня было что-то вроде этого:
и затем изменение его кода ниже решило мою проблему.
источник
для меня это было просто отсутствие
()
@Injectable. Proper - это @Injectable ()источник
Удаление параметров из метода injectable constructor () решило проблему для моего случая.
источник
В моем случае это было из-за плагина Augury, отключить его будет нормально. Альтернативный вариант есть, тоже работает.
все кредиты @ Boboss74, он разместил ответ здесь: https://github.com/angular/angular/issues/23958
источник
Ну, для меня проблема была еще более раздражающей, я использовал службу внутри службы и забыл добавить ее в качестве зависимости в appModule! Надеюсь, это поможет кому-то сэкономить несколько часов, ломая приложение только для того, чтобы восстановить его снова
источник
@Inject
аннотацию. Я упускал из виду именно то, что сообщение об ошибке говорит немного. Если вы не подозреваете о циклических зависимостях, просто перейдите к классу, указанному в ошибке, и посмотрите на все параметры конструктора и всех членов класса, помеченных комментариями,@Inject
и убедитесь, что вы делаете DI правильно для всех них. Подробнее о DI здесь: angular.io/docs/ts/latest/guide/dependency-injection.htmlВы должны добавить массив провайдеров в @Component decorator или в модуль, где объявлен ваш компонент. Внутри компонента вы можете сделать, как показано ниже:
источник
В моем случае, передача неправильных параметров в конструктор генерирует эту ошибку, основная идея этой ошибки заключается в том, что вы неосознанно передали некоторые неправильные аргументы любой функции.
Я решил это, просто удалив этот аргумент.
источник
Для меня, я получил эту ошибку, когда я по ошибке отключил этот импорт в файле polyfills.ts, вы должны убедиться, что он импортирован, чтобы избежать этой ошибки.
источник
В моем случае я пытался расширить "
NativeDateAdapter
", чтобы переопределить "format(date: Date, displayFormat: Object)
" метод.В AngularMaterial-2 DatePicker.
Поэтому я забыл добавить
@Injectable
аннотацию.После того как я добавлю это в мой класс "CustomDateAdapter":
Ошибка ушла.
источник
Этот ответ может быть очень полезным для этой проблемы. Кроме того, для моего случая, экспорт услуг, как это
default
было причиной.НЕПРАВИЛЬНО:
ПРАВИЛЬНЫЙ:
источник
Это может быть действительно трудной проблемой для устранения из-за отсутствия обратной связи в ошибке. Если вас беспокоит фактическая циклическая зависимость, вот самое важное, что нужно посмотреть в трассировке стека: а) имя службы; б) параметр конструктора в этой службе, который имеет вопросительный знак, например, выглядит ли он следующим образом:
тогда это означает, что 5-й параметр является сервисом, который также зависит от AuthService. т.е. вопросительный знак означает, что он не был решен DI.
Оттуда вам просто нужно отделить 2 службы путем реструктуризации кода.
источник
Я столкнулся с этой ошибкой, набрав неправильно имя службы, то есть конструктор (private myService: MyService ).
Для сервисов с ошибками я смог определить, какой сервис был проблемой (у меня их было несколько в конструкторе), просмотрев страницу в Chrome-> Консоль. Как часть сообщения вы увидите список массивов параметров с отображением объекта Object, Object Object,? (или что-то типа того). Обратите внимание, где "?" и это позиция службы, которая вызывает проблему.
источник
Хотя порядок возможно, упоминалось экспортируемых классов из бочек, следующий сценарий также может дать тот же эффект.
Предположим , у вас есть классы
A
,B
иC
экспортируются из того же файла , в которомA
зависит отB
иC
:Поскольку зависимые классы (т.е. в этом случае классы
B
иC
) еще не известны Angular, ( вероятно, во время выполнения во время процесса внедрения зависимостей Angular в классA
) возникает ошибка.Решение
Решение состоит в том, чтобы объявить и экспортировать зависимые классы перед классом, в котором выполняется DI.
то есть в вышеприведенном случае класс
A
объявляется сразу после определения его зависимостей:источник
В моем случае я экспортировал Class и Enum из одного файла компонента:
mComponent.component.ts
:Затем я пытался использовать
MyEnum
от ребенкаMyComponentClass
. Это приводило к ошибке « Не удается разрешить все параметры» .Переместившись
MyEnum
в отдельную папкуMyComponentClass
, это решило мою проблему!Как отметил Гюнтер Цохбауэр, это происходит из-за того, что услуга или компонент циклически зависимы.
источник
Если ваша служба определена в том же файле, что и компонент (который ее использует), а служба определяется после компонента в файле, вы можете получить эту ошибку. Это связано с той же проблемой 'forwardRef', о которой упоминали другие. В настоящее время VSCode не очень хорошо показывает эту ошибку, и сборка успешно компилируется.
Запуск сборки с помощью
--aot
может скрыть эту проблему из-за того, как работает компилятор (возможно, это связано с дрожанием дерева).Решение. Убедитесь, что служба определена в другом файле или перед определением компонента. (Я не уверен, можно ли использовать forwardRef в этом случае, но это кажется неуклюжим).
Если у меня есть очень простой сервис, который очень сильно привязан к компоненту (вроде как модель представления) - например.
ImageCarouselComponent
Я могу назвать егоImageCarouselComponent.service.ts
так, чтобы он не смешивался с другими моими услугами.источник
В моем случае это была круговая ссылка. У меня был MyService, вызывающий Myservice2, и MyService2, вызывающий MyService.
Фигово :(
источник
В моем случае причина была следующая:
Как следствие, при попытке создать объект A конструктор по умолчанию потерпел неудачу. Я понятия не имею, почему это не было ошибкой компиляции.
Я исправил это, просто добавив конструктор в A, который правильно назвал конструктор B.
источник
Попался!
Если ни один из приведенных выше ответов не помог вам, возможно, вы импортируете какой-то элемент из того же файла, в который компонент внедряет службу.
Я объясню лучше:
Это служебный файл :
Это файл компонента :
Таким образом, это вызывает проблемы, даже если символ находится не внутри того же компонента, а только внутри одного файла. Переместите символ (это может быть функция, константа, класс и т. Д.) В другое место, и ошибка исчезнет
источник
для угловых 6 и более новых версий, попробуйте
.. прямо над вашим классом обслуживания без других линий между ними
преимущества
[ угловые документы ]
источник