当前位置: 首页 > 知识库问答 >
问题:

在index.ts中自动排序导出使应用程序崩溃

慕容聪
2023-03-14

每次在共享文件夹中生成内容时,index.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';

未处理的promise拒绝:错误:无法解析'AuthGuard'的所有参数(未定义,路由器)。确保所有参数都用Inject修饰或具有有效的类型注释,并且'AuthGuard'用injectable修饰。

export * from './auth.service';
export * from './auth.guard';
"@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"

共有1个答案

卢权
2023-03-14

这是一个以桶为单位的出口订单问题。在这里的angular repo中有报道:https://github.com/angular/angular/issues/9334

有三种变通办法:

更改顺序,以便模块依赖项列在其依赖项之前。

export * from './auth.service';
export * from './auth.guard';
import { AuthService } from './auth.service';
import { User } from './';

更改typescript编译器选项以编译为SystemJS格式而不是CommonJS格式。这是通过将tsconfig.json的compileroptions.modulecommonJS更改为system来实现的。

请注意,在更改该配置时,需要将所有组件装饰器的moduleid属性从module.id更新为__modulename,并在typings.d.ts中声明如下:

declare var __moduleName: string;

此模块格式不是Angular-CLI工具(由Angular团队创建的官方构建工具)中的默认格式,因此可能不推荐或不支持。

注意:我个人对任何变通办法都不满意。

 类似资料:
  • 我正在Eclipse中创建一个应用程序,现在我想在我的项目中使用appcompat库。我已经成功地导入了这个库,当我用AppCompatActivity扩展一些活动时,它工作得很好。问题是,当我运行应用程序时,我的应用程序启动由AppCompActivty扩展的活动。应用程序崩溃。Log Cat正在显示NoClassDefFoundError:请为我指引正确的方向。谢谢

  • 这里是Android开发者新手。我在MainActivity中使用recyclerview,应用程序不断崩溃。 任何帮助都将受到赞赏! 编辑:对不起,我是新来的。我已经附加了Logcat。和其他xml文件。谢谢 这是我的代码: 列出你的布局。xml: activity_main.xml: } ProductAdapter。java类: } Logcat: 致命异常:主进程:e.wolverine2

  • 在我的应用程序中,我想在导航抽屉的片段中使用一个gridView,但我的应用程序正在崩溃。这是我的代码:

  • 我已经为MediaPlayer创建了一个类,这样我就可以从多个类访问它,因为我需要在一次活动中启动媒体并在另一个活动中停止它。尝试调用mediaPlayer时,我出错。我不明白我在这方面出了什么错,因为我不完全理解错误。在为MediaPlayer创建类之前,它是有效的,但它不允许我做我想做的事情。是否有人可以建议我如何解决我的问题或以其他方式访问MediaPlayer。提前谢谢。 MainActi

  • 我正试图通过Appium、Selenium框架自动化一些在Android设备上运行的移动应用程序测试。我已经在Selenium中设置了测试类,并尝试使用以下所需功能启动android驱动程序。我的Appium版本是1.4.16.1 当我在真正的三星设备上运行测试时,应用程序被打开,然后在打开时立即崩溃,并带有消息,我的测试应用程序是 当我在Appium桌面控制台中查看日志时,我看到以下内容: 请帮

  • 当我从列表视图小部件或应用程序中注释一行时,它可以工作,但当我取消注释时,它根本不出现... 它是一个listview来呈现您通过api收到的通知列表,api与未来的构建器一起正常工作,但是当我添加listBuilder时,它停止工作…… 代码 日志终端