Ionic2/Angular2 - 读取自定义配置文件

2023-12-28

我正在开发 ionic2 项目,需要创建一个新的自定义 JSON 配置文件。我找到了一些教程来创建一个并通过 http.get 访问它,但我认为通过 get 请求调用它很奇怪。我希望它位于根文件夹(所有配置 JSON 都在其中),然后我直接打开/读取该文件。

不知道是否可行,或者是否值得推荐?这就是为什么我在这里发帖寻求一些意见和解决方案:)

Thanks


我个人不喜欢使用 http.get 读取 config.json 文件处理配置信息的方法,即使必须有另一种方法只需包含并阅读代码中的 json 文件,既然我们使用 Angular2 和 Typescript,为什么不使用类、接口并以更奇特的方式来做呢?

接下来我将向您展示的内容可能看起来比一开始要复杂(尽管读完后您会发现它非常简单且易于理解),但是当我开始学习 Angular2 时,我看到了一个关于他们如何处理的示例配置文件 in the 依赖注入指南 https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#dependency-injection-tokens我在我开发的应用程序中遵循了这一点来处理配置信息(如 API 端点、默认值等)。

根据文档:

非类依赖

[...]

应用程序通常定义具有许多小配置对象 事实(例如应用程序的标题或 Web API 的地址 端点),但这些配置对象并不总是 班级。

为非类依赖项选择提供者令牌的一种解决方案 是定义和使用 OpaqueToken

因此,您需要定义一个包含 url 等的配置对象,然后是OpaqueToken以便能够在使用您的配置注入对象时使用它。

我将所有配置都包含在app-config.ts file

// Although the ApplicationConfig interface plays no role in dependency injection, 
// it supports typing of the configuration object within the class.
export interface ApplicationConfig {
  appName: string;
  apiEndpoint: string;
}

// Configuration values for our app
export const MY_CONFIG: ApplicationConfig = {
  appName: 'My new App',
  apiEndpoint: 'http://www...'
};

// Create a config token to avoid naming conflicts
export const MY_CONFIG_TOKEN = new OpaqueToken('config');

What OpaqueToken一开始可能会令人困惑,但它只是一个字符串,可以避免注入该对象时的命名冲突。你可以找到一篇关于这个的精彩帖子here http://blog.thoughtram.io/angular/2016/05/23/opaque-tokens-in-angular-2.html.

然后,您只需将其包含在您需要的页面中,如下所示:

import { NavController } from 'ionic-angular/index';
import { Component, OpaqueToken, Injectable, Inject } from "@angular/core";

// Import the config-related things
import { MY_CONFIG_TOKEN, MY_CONFIG, ApplicationConfig } from 'app-config.ts';

@Component({
  templateUrl:"home.html",
  providers: [{ provide: MY_CONFIG_TOKEN, useValue: MY_CONFIG }]
})
export class HomePage {

  private appName: string;
  private endPoint: string;

  constructor(@Inject(MY_CONFIG_TOKEN) private config: ApplicationConfig) {
    this.appName = config.appName;
    this.endPoint = config.apiEndpoint;
  }
}

请注意如何将其包含在providers array

providers: [{ provide: MY_CONFIG_TOKEN, useValue: MY_CONFIG }]

以及如何告诉注入器应该如何获取配置对象的实例

@Inject(MY_CONFIG_TOKEN) config: ApplicationConfig

UPDATE

OpaqueToken自 v4.0.0 以来已被弃用,因为它不支持类型信息,请使用InjectionToken<?>反而。

所以代替这些行:

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

// Create a config token to avoid naming conflicts
export const MY_CONFIG_TOKEN = new OpaqueToken('config');

现在我们应该使用

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

// Create a config token to avoid naming conflicts
export const MY_CONFIG_TOKEN = new InjectionToken<ApplicationConfig>('config');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ionic2/Angular2 - 读取自定义配置文件 的相关文章

随机推荐

  • check 未在meteor.js 中定义

    我是流星新手 我尝试使用文件上传tomitrescak meteor uploads https github com tomitrescak meteor uploads 我成功上传了一些文件 但是当我尝试删除上传的文件时 我的终端出现错
  • 使用自动布局时 AVPlayer / AVPlayerLayer 不会出现在子视图中

    我正在尝试在包含视频和一些文本的子视图内显示视频 我用的是Apple 推荐的 UIView 子类 https developer apple com library ios documentation AudioVideo Conceptu
  • 无法在 Delphi 中为 VIES SOAP 服务加载 WSDL 文件/位置

    我正在尝试创建一个 Delphi XE2 函数来通过 VIES 的 SOAP 服务检查增值税号 http ec europa eu taxation customs vies checkVatService wsdl http ec eur
  • 使内容可在 Addon SDK 上访问

    我正在使用 Firefox 的 Addon SDK v 1 11 开发一个插件 我的扩展在每个网站上动态创建一个 iframe 然后加载一个 html 文件 其中包括来自附加组件本地目录的其他资源 例如图像 字体文件等 Problem 加载
  • 我尝试使用 OpenHardwareMonitor 源代码,但从未获得我的显卡温度,这可能是什么问题?

    在form1中我做了 using System using System Collections Generic using System ComponentModel using System Data using System Draw
  • 可信时间戳 - 了解格式 (rfc3161)

    edit 我写了一篇博文 详细解释了一切 看这里 http www d mueller de blog dealing with trusted timestamps in php rfc 3161 Hi 我正在拼命尝试构建基于 rfc31
  • IE9 不接受标准 jQuery 语法

    这真的很简单 我有以下代码 它适用于所有其他 html5 兼容浏览器 Safari 5 Chrome 9 FireFox 但在 IE9 RC 中我收到以下错误 jquery min js 线路 16 错误 对象不支持属性或方法 getEle
  • 如何避免shared_ptr内存泄漏?

    考虑以下代码 using boost shared ptr struct B struct A A std cout lt lt A lt lt std endl shared ptr b b struct B B std cout lt
  • c# Visual Studio ...以编程方式添加引用

    无论如何 是否可以通过编程方式将引用添加到解决方案中 我有一个加载项按钮 当用户按下它时 我想要添加一个引用 原因是 我创建了一个软件 我想将其集成到任何给定的 VS 程序中 如果开发人员需要的话 他们只需单击加载项按钮 引用就会加载到当前
  • Twitter Bootstrap 上的语法突出显示

    我试图使用 Google prettify 突出显示一些语法 但到目前为止 它不起作用 pre class prettyprint code class language css Some source code class Foo pub
  • 单例中的实体框架上下文

    我正在构建一个在单例模式中使用 EF 上下文的应用程序 例如 NHibernate 与会话一起使用 public class DbContextFactory private static volatile DbContextFactory
  • 客户端找不到 {} 的调度方法

    我有这个示例代码 private static final String endpoint https www 443 WSEndUser wsdl public static void main String args throws SO
  • 实体框架 5 软删除

    我试图防止对我的数据库表进行任何删除 目前使用实体框架 5 首先这是我的代码 public override int SaveChanges var Changed ChangeTracker Entries if Changed null
  • 将意图从服务发送到活动

    我正在尝试返回结果IntentSerivce to the mainactivity使用意图 但我无法让它发挥作用 这IntentService毫无问题地从活动中接收意图 执行它的操作并获得JSONstring 现在剩下的唯一问题是将这个字
  • 修改 servlet 上下文初始化参数() 值

    我正在经历一个 Web 开发过程 其中有两个参数 即用户名和密码作为 web xml 文件中的上下文参数 例如
  • jqgrid 删除时出现错误消息

    我为我的 jqgrid 添加了以下代码 changeTextFormat function data return Activity or one from the same price group already used jQuery
  • java.net.BindException:绑定失败:EADDRINUSE(地址已在使用中)

    我有一个服务 它启动线程在套接字上执行一些操作 代码如下 public class ServerRunnable implements Runnable Override public void run ServerSocket serve
  • 联合仅选择一行

    我有一个带有两个 Select 子句与 UNION 组合的查询 我只想选择顶部第一行 我该如何使用 Union 来做到这一点 Select Fault OccurredOn From ATMStatus Where Ticket 18970
  • 如何在weblogic中远程部署应用程序?

    我有两台计算机 我不想在我的开发计算机上安装weblogic和oracle 它们消耗太多内存 问题是我如何将开发计算机上的应用程序部署到另一台安装了oracle和weblogic的空闲计算机上 我使用的是weblogic 10 3 我不想在
  • Ionic2/Angular2 - 读取自定义配置文件

    我正在开发 ionic2 项目 需要创建一个新的自定义 JSON 配置文件 我找到了一些教程来创建一个并通过 http get 访问它 但我认为通过 get 请求调用它很奇怪 我希望它位于根文件夹 所有配置 JSON 都在其中 然后我直接打