Автоматический порядок экспорта в index.ts приводит к сбою приложения

Каждый раз, когда я генерирую что-то в своей общей папке, файл index.ts перестраивается и экспорт размещается в алфавитном порядке. Это, кажется, нарушает зависимости для меня. Изменение порядка вручную, так что зависимости экспортируются до того, как классы с зависимостями заставят его снова работать.

Если у нас естьapp/shared/auth.guard.ts:

import { Injectable } from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot } from '@angular/router';
import { Observable } from 'rxjs/Observable';

import { AuthService, User } from './';

@Injectable()
export class AuthGuard implements CanActivate {

    constructor(private accountService: AuthService, private router: Router) { }

    canActivate(next: ActivatedRouteSnapshot): Observable<boolean> {
        let result = this.accountService.currentUser.first().map(user => user != null);

        let route: any[] = ['/login'];

        if (next.url.length) {
            route.push({ redirectUrl: next.url });
        }

        result.subscribe(isLoggedIn => {
            if (!isLoggedIn) {
                this.router.navigate(route);
            }
        });

        return result;
    }
}

а такжеapp/shared/account.service.ts:

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';

import { User } from './';

const LOCAL_STORAGE_KEY = 'currentUser';

@Injectable()
export class AuthService {
  private currentUserSubject: BehaviorSubject<User>;

  constructor() {
    this.currentUserSubject = new BehaviorSubject<User>(this.getUserFromLocalStorage())
    this.currentUserSubject.subscribe(user => this.setUserToLocalStorage(user));
  }

  logIn(userName: string, password: string) : Observable<User> {
    this.currentUserSubject.next({
      id: userName,
      userName: userName,
      email: userName
    });

    return this.currentUser.first();
  }

  logOut() {
    this.currentUserSubject.next(null);
  }

  get currentUser(): Observable<User> {
    return this.currentUserSubject.asObservable();
  }

  private getUserFromLocalStorage(): User {
    let userString = localStorage.getItem(LOCAL_STORAGE_KEY);

    if (!userString) {
      return null;
    }

    return JSON.parse(userString);
  }

  private setUserToLocalStorage(user: User) {
    if (user) {
      localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(user));
    }
    else {
      localStorage.removeItem(LOCAL_STORAGE_KEY);
    }
  }

}

Это не работает:

export * from './auth.guard';
export * from './auth.service';

Unhandled Promise rejection: Error: Cannot resolve all parameters for 'AuthGuard'(undefined, Router). Make sure that all the parameters are decorated with Inject or have valid type annotations and that 'AuthGuard' is decorated with Injectable.

Это работает:

export * from './auth.service';
export * from './auth.guard';

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

Хотелось бы, чтобы мне не приходилось каждый раз менять это вручную. Есть ли обходной путь? Могу ли я структурировать файлы другим способом?

Зависимости отpackage.json:

"@angular/common": "^2.0.0-rc.2",
"@angular/compiler": "^2.0.0-rc.2",
"@angular/core": "^2.0.0-rc.2",
"@angular/forms": "^0.1.0",
"@angular/http": "^2.0.0-rc.2",
"@angular/platform-browser": "^2.0.0-rc.2",
"@angular/platform-browser-dynamic": "^2.0.0-rc.2",
"@angular/router": "^3.0.0-alpha.7",
"bootstrap": "^3.3.6",
"es6-shim": "0.35.1",
"moment": "^2.13.0",
"ng2-bootstrap": "^1.0.17",
"reflect-metadata": "0.1.3",
"rxjs": "5.0.0-beta.6",
"slideout": "^0.1.12",
"systemjs": "0.19.26",
"zone.js": "0.6.12"

devDependencies:

"angular-cli": "1.0.0-beta.6"
 mollwe19 июн. 2016 г., 02:46
изменение импорта наimport { AuthService } from './auth.service'; import { User } from './'; это возможный обходной путь для этого
 mollwe19 июн. 2016 г., 02:43
Удаление AuthService из конструктора AuthGuard устраняет ошибку. Так что, похоже, что-то связано с инъекцией.

Ответы на вопрос(3)

Вы также можете получить эту ошибку в Angular2 live и предположить, что angular не хочет создавать экземпляр службы, которая уже была создана. Это может произойти, если вы «неправильно» включите услугу, например, ActivatedRoute из '@ angular / router' в свойствеайдеров декоратора класса @Component, несмотря на то, что он уже включил RouterModule в файл App.module, который в любом случае регистрирует всех провайдеров маршрутизатора и директивы для приложения.

и это было вызвано циркулярной ссылкой. Пояснения: в «классе обслуживания провайдера» у меня была ссылка на страницу пользовательского интерфейса, на которую конструктор ссылался на эту же службу, вызывая циклическую ссылку ...

import { MyUIPage } from "../pages/example/myuipage";

Итак, что мне нужно было сделать, это удалить ссылку из сервиса и построить функцию, получающую обратный вызов. Нет необходимости ссылаться на страницу интерфейса пользователя от службы, и ошибка исчезает.

public setCallBackSpy(callback)
{
   this.callBackSpy = callback;
}

В конструкторе класса app.component, который ссылается на сервис, я просто установил ссылку на функцию обратного вызова, как показано ниже.

this.servicingClass.setCallBackSpy(this.myCallBackFunctionUsingUIPage);

Надеюсь, это поможет, мой первый ответ когда-либо :)

Решение Вопроса

овом репо здесь:https://github.com/angular/angular/issues/9334

Есть три обходных пути:

Измените порядок экспорта в ваших бочках

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

В этом примере AuthGuardзависит на AuthService. AuthService являетсязависимость AuthGuard. Поэтому экспортируйте AuthService перед AuthGuard.

export * from './auth.service';
export * from './auth.guard';
Не используйте бочки вообще.

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

В этом примере вы бы импортировали AuthService из его файла, а не из бочки.

import { AuthService } from './auth.service';
import { User } from './';
Используйте формат модуля systemJS, а не commonJS

Измените параметры компилятора машинописного текста, чтобы компилировать его в формат SystemJS, а не в commonJS. Это делается путем изменения tsconfig.json'scompilerOptions.module отcommonjs вsystem.

Обратите внимание, что при изменении этой конфигурации вам нужно будет обновитьmoduleId свойства всех ваших компонентов декораторов изmodule.id в__moduleName и объявить это вtypings.d.ts следующее:

declare var __moduleName: string;

Этот формат модуля не используется по умолчанию вУгловой-CLI инструмент (официальный инструмент сборки, созданный командой Angular) и поэтому не может быть рекомендован или поддержан.

Примечание: я лично не удовлетворен ни одним из обходных путей.

 Michael20 июн. 2016 г., 04:58
Это, скорее всего, указывает на то, что некоторые или все ваши файлы не были созданы с использованиемsystem, Если вы просматриваете скомпилированный*.js файлы в вашем каталоге dist, файлы должны начинаться сSystem.register(... и вы должны увидеть__moduleName переменная объявляется чуть дальше. Повторно запуститьng serve/ng build и посмотрим, исправит ли это.
 mollwe20 июн. 2016 г., 00:44
Спасибо за ваш ответ и направив меня в отчет об ошибке, я пропустил это. Попробовал использовать систему вместо commonjs, и она была построена просто отлично, но я получаюUnhandled Promise rejection: ReferenceError: __moduleName is not defined при попытке запустить его в браузере. Я делаю что-то неправильно?
 hsantos22 сент. 2016 г., 11:26
Извините, но что вы подразумеваете под бочкой? У меня та же проблема. У меня есть служба, и она работает, когда вводится в один компонент, но не когда вводится в другой. Эти два компонента находятся на одном уровне, но служба отстает от двух каталогов. Это импорт, который я имею в компонентах: import {ViewNavigatorService} из './../../services/viewnavigator'; и это ошибка: ОРИГИНАЛЬНОЕ ИСКЛЮЧЕНИЕ: Не удается разрешить все параметры для SubmenuPage: (NavController, NavParams, PopoverController, AlertController, ModalController,?). Я получаю (?), Когда это должен быть сервис.

Ваш ответ на вопрос