我正在使用通用启动器作为主干。
当我的客户端启动时,它会从 localStorage 读取有关用户信息的令牌。
@Injectable()
export class UserService {
foo() {}
bar() {}
loadCurrentUser() {
const token = localStorage.getItem('token');
// do other things
};
}
一切正常,但是由于服务器渲染,我在服务器端(终端)得到了这个:
例外:ReferenceError:localStorage 未定义
我从ng-conf-2016-universal-patterns中得到了使用依赖注入来解决这个问题的想法。但是那个演示真的很老了。
假设我现在有这两个文件:
主浏览器.ts
export function ngApp() {
return bootstrap(App, [
// ...
UserService
]);
}
主节点.ts
export function ngApp(req, res) {
const config: ExpressEngineConfig = {
// ...
providers: [
// ...
UserService
]
};
res.render('index', config);
}
现在他们使用相同的用户服务。有人可以给出一些代码来解释如何使用不同的依赖注入来解决这个问题吗?
如果有另一种更好的方法而不是依赖注入,那也很酷。
更新 1我正在使用 Angular 2 RC4,我尝试了@Martin 的方式。但即使我导入它,它仍然在下面的终端中给我错误:
终端(npm 开始)
/my-project/node_modules/@angular/core/src/di/reflective_provider.js:240 throw new reflector_exceptions_1.NoAnnotationError(typeOrFunc, params); ^ 错误:无法解析“UserService”(Http,?)的所有参数。确保所有参数都用 Inject 修饰或具有有效的类型注释,并且“UserService”用 Injectable 修饰。
终端(npm 运行观察)
错误 TS2304:找不到名称“LocalStorage”。
我猜它在某种程度上与LocalStorage
from重复angular2-universal
(虽然我没有使用import { LocalStorage } from 'angular2-universal';
),但即使我尝试将我的更改为LocalStorage2
,仍然无法正常工作。
同时,我的 IDE WebStorm 也显示为红色:
顺便说一句,我找到了一个import { LocalStorage } from 'angular2-universal';
,但不知道如何使用它。
UPDATE 2,我改为(不确定是否有更好的方法):
import { Injectable, Inject } from '@angular/core';
import { Http } from '@angular/http';
import { LocalStorage } from '../../local-storage';
@Injectable()
export class UserService {
constructor (
private _http: Http,
@Inject(LocalStorage) private localStorage) {} // <- this line is new
loadCurrentUser() {
const token = this.localStorage.getItem('token'); // here I change from `localStorage` to `this.localStorage`
// …
};
}
这解决了UPADAT 1中的问题,但现在我在终端出现错误:
例外:TypeError:this.localStorage.getItem 不是函数