【发布时间】:2017-05-19 03:42:30
【问题描述】:
我有一个angular-cli 生成的项目,我想与deployd 后端一起使用。 Deployd 提供了一个用于访问其 API 的脚本,该脚本可以从 http://<deployd-host>/dpd.js 加载。这将创建一个全局 dpd 对象,该对象可以从 javascript 全局上下文(例如,从 Chrome 开发工具控制台)访问 API。
我想把它包装在一个 Angular2 服务中,这样我就可以注入一个模拟服务来进行测试等。任务是从 URL 加载脚本,然后访问全局 dpd 对象。我查看了this SO 帖子,但无法获得公认的工作答案。如果我手动将脚本添加到document 对象,我无法访问window 上的dpd 对象。
此外,加载脚本的 URL 也会因环境而异,例如http://localhost:3000/dpd.js 用于本地开发,http://dev.example.com/dpd.js 用于暂存,http://www.example.com/dpd.js 用于生产。所以理想情况下,我也可以在服务中配置它。
寻找类似下面的东西来工作。
@Injectable()
export class DpdService {
constructor() {
if (getEnvironmentSomeHow() == 'development') {
loadScriptFrom("http://localhost:3000/dpd.js");
} else {
loadScriptFrom("http://dev.example.com/dpd.js");
}
dpd = window.dpd;
}
public session(): Observable<Session> {
return Observable.fromPromise(dpd.sessions.get());
}
}
【问题讨论】:
-
能否分享一些代码
-
可能重复:stackoverflow.com/questions/39942118/… 非常详细的代码解释
-
你在问题中展示的方法有什么问题?
-
@estus 1.不知道环境如何,2.没有
loadScriptFrom的优雅实现,3.如果通过向文档添加脚本标签来加载,则dpd当我使用它时,窗口上的对象不可用。如果我从 Chrome 中的控制台检查,它是可用的,所以这似乎是一个异步问题。