2017-02-18 46 views
-1

从我尝试使用打字稿,angular2和asp核心进行一些简单的作业,花了大约10个小时。我会解释我到达的路径以及你对我有什么想法,我会感激。TypeScript无法找到模块经常发生

首先,你应该考虑的是我使用的项目模板从波纹管链接:

Template

然后我想添加一些代码来存储在localStorage的一些数据。

一些链接表明我必须有访问localStorage非常简单。但是,当我想从angular2的组件内访问本地存储,我得到这个错误:

localStorage is not defined

然后,我用Google搜索了很多的解决方案,发现下面的库:

angular2-localstorage

angular-2-local-storage

angular2-local-storage

但所有这些都不起作用。

然后我试着写一个服务会很容易访问localStorage的希望。然后,我创建这个文件:

/ClientApp/app/services/local-storage-service.ts

export class LocalStorageService { 
    write(key: string, value: any) { 
     if (value) { 
      value = JSON.stringify(value); 
     } 
     localStorage.setItem(key, value); 
    } 

    read<T>(key: string): T { 
     let value: string = localStorage.getItem(key); 

     if (value && value != "undefined" && value != "null") { 
      return <T>JSON.parse(value); 
     } 

     return null; 
    } 
} 

但是当我试图导入这样的:

import { LocalStorageService } from 'services/local-storage-service'; 

我这个错误:

cannot find module 'services/local-storage-service' 

我已经尝试了一切你可以猜测。怪异的是,进口波纹管正常工作:

import { AppComponent } from './components/app/app.component'; 

该文件是在“/ClientApp/app/app.component.ts”但是当我将该文件复制到“/services/app.component。 ts'发生相同的错误。

我对关于如何提出有关此问题的问题没有足够的想法。但我会尝试你的任何想法。

**** UPDATE 这是目录树:

Directory Tree

虽然在文件app.modules.ts我可以这样访问:

import { LocalStorageService } from './services/local-storage.service'; 

没有错误。但在文件settoken.component.ts它会导致错误。

*** REUPDATE

现在使用正确的路径我有服务的注射。但它说localStorage没有定义! 服务代码是建议的。

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

@Injectable() 
export class LocalStorageService { 
    private storage: any; 

    constructor() { 
     this.storage = localStorage; 
    } 

    public retrieve(key: string): any { 
     var item = this.storage.getItem(key); 

     if (item !== null && item !== 'undefined') { 
      return JSON.parse(this.storage.getItem(key)); 
     } 

     return; 
    } 

    public store(key: string, value: any) { 
     this.storage.setItem(key, JSON.stringify(value)); 
    } 

} 

和错误:

Exception: Call to Node module failed with error: Error: Uncaught (in promise): ReferenceError: localStorage is not defined 
ReferenceError: localStorage is not defined 

TG。

+0

导入路径中是否缺少'。/'或'../'?一般情况下,只有节点模块才能在没有导入的节点模块的情况下启动,除非您使用捆绑器(我不知道ts是否知道)做了一些神奇的事情(根据“https://www.typescriptlang.org/docs/handbook”) –

+0

/module-resolution.html#relative-vs-non-relative-module-imports“将在任何父目录上尝试非相对路径。但我尝试了你提到的那些。没有改变! – ConductedClever

+0

嗯,我不知道这个,今天学到了一些新东西!谢谢!对不起,它对你没用。 –

回答

2

对于非模块文件,您将不得不使用相对路径;例如,./,../。您不会说要尝试导入与该服务相关的服务的文件在哪里。假设它在父目录中,路径将是./services/local-storage-service

如果您仍然遇到问题,可以尝试使用本地存储服务。

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

@Injectable() 
export class LocalStoragePersistence { 
    private storage:any; 

    constructor() { 
     this.storage = localStorage; 
    } 

    public retrieve(key:string):any { 
     var item = this.storage.getItem(key); 

     if (item !== null && item !== 'undefined') { 
      return JSON.parse(this.storage.getItem(key)); 
     } 

     return; 
    } 

    public store(key:string, value:any) { 
     this.storage.setItem(key, JSON.stringify(value)); 
    } 

} 

将其导入到你的组件与

import { LocalStoragePersistence } from './services/local-storage.service'; 

请务必记得要声明它在你的供应商阵列:providers: [ LocalStoragePersistence ]

注有建议将文件重命名为local-storage.service.ts。这是文件(feature.type.ts)的Angular 2命名模式。希望这可以帮助。

+0

您的评论很好,但还没有答案。请考虑我已添加的更新。任何其他想法? – ConductedClever

+0

哦。它解决了!通过此路径“从”../../services/local-storage.service“导入{LocalStorageService};”让我找到原因。因为我以前尝试过所有这些方法。 – ConductedClever

+0

我认为问题出在其中一种工具上。现在即使没有正确的命名也没有注射剂它工作正常!但我确信我以前已经尝试了所有这些。我怀疑VS在运行模式下的功能。 – ConductedClever