【问题标题】:store json data into array in Angular TypeScript将 json 数据存储到 Angular TypeScript 中的数组中
【发布时间】:2019-04-05 02:20:32
【问题描述】:

我在使用 Angular 提及库时遇到问题。

这是我的打字稿代码。

items: Object[] = ["jay","roy","gini","rock","joy","kiya"];

我在我的component.html file 中使用这个定义的名为items 的数组

<input  type="text" id="cname" name="cname" placeholder="Type  Here.." [mention]="items">

所以它正在创建一个文本框,并在我输入任何用户名时给出建议。

假设我输入@j,那么它会建议所有以名称j开头的名称,输入后将输入带有@符号的文本框。所以基本上它提供了从数组中自动搜索的功能,为此,我已将 mention 库导入到我的 Angular7 应用程序中。

我正在设计一个项目,其中所有用户都来自 Web 服务。所以我需要将这些用户存储到 items 命名数组中。

JSON格式如下。

 [
   {
      "attributes":  {
        "User": "jay"
    }
},
   {
      "attributes": {
        "User": "roy"
    }
},
    {
      "attributes":{
        "User": "kiya"
    }
},
    {
      "attributes":{
        "User": "gini"
    }
},
   {
      "attributes": {
        "User": "rock"
    }
},
   {
      "attributes": {
        "User": "joy"
    }
}

]

以上 JSON 数据来自网络服务器,我将其存储到变量中。所以我想将它存储到上面名为items 的数组中,以便在我的文本框中输入它可以给出真实数据的自动建议。

我试过这个东西,但是在输入文本框的时候,它没有给出任何建议。

【问题讨论】:

  • 您已将名为items 的变量定义为Object[],表示对象数组。然后将此变量初始化为值["jay","roy","gini","rock","joy","kiya"];,它是一个字符串数组(string[])。这没有意义
  • "我试过这个东西" ...你试过什么?我看不到将 json 从 Web 服务映射到字符串 [] 的逻辑。
  • @RyanE。我从服务器获取的用户,我使用服务调用将其存储在一个变量中,然后我用该变量映射了项目,但是通过这种方法,我在输入时无法获得建议。这就是我尝试过的。
  • 我留下了答案。如果这没有帮助,您可以用您尝试过的内容做出回应吗?可能 Angular 没有检测到对象数组的变化,因为 Angular 会查看引用,如果引用没有改变,那么它不会将更新后的数组发送到指令。
  • @JayeshVyas 尝试像我在回答中所说的那样使用 mentionConfig

标签: angular typescript angular7


【解决方案1】:

如果您需要帮助将 Web 服务结果映射到字符串数组,类似这样的方法应该可以解决问题。

更新了最新 json 的答案。

this.myWebService.myWebServiceMethod.subscribe(result => {
    this.items = result.map(item => {
        return item.attributes.User;
    }
}

正如@abd995 指出的那样,由于您正在遍历数组,因此此方法可能存在性能问题。请注意执行上述代码的频率。如果您的数组相对较小,则无需担心太多,但如果您有 5k+ 条记录,您可能需要考虑更新 API 以以更好的格式返回数据 - 您无需操作。

【讨论】:

  • 如果数组很大,不推荐循环遍历数据集,会导致性能问题。尤其是当“提及”适用于对象数组时。
  • @abd995 当然。但是,如果库不支持这种类型的配置,那么您别无选择,只能转换为字符串数组。或者更新你的后端返回一个字符串数组。
【解决方案2】:

当项目是对象数组时,请添加mentionConfig。要用作 label 的对象的字段应该像这样在提及配置中作为 labelKey 给出。

<input type="text" [mention]="items" [mentionConfig]="{ labelKey:'User'}">

更新

由于问题是使用具有两个嵌套属性的对象数组更新的,因此 mentionConfig 无法使用,因为 mention 最多只支持一级嵌套属性。检查提及的源代码here。我还在github 中提出了一个关于此的问题。所以在这种情况下,我们必须像这样从对象数组创建一个标签数组。

items = items.map((item) => item.attributes.User);

【讨论】:

  • 这也需要作者将来自网络服务器的响应直接设置为 items[]。这可能就是他们正在做的事情,即使这个问题并没有让你得出那个结论。
  • 啊,没关系,我看到他们在哪里说“所以我想将它存储到上面名为 items 的数组中”。我想我很困惑,因为初始值是字符串。我也没想到这个库有一个配置类型变量,它允许你在一个对象上指定一个键来查看。为该库作者 +1
  • 您好,您的解决方案运行正常,我需要您的建议,因为我不知道如何正确使用 Angular 中的库。如果我的 JSON 格式发生变化。请在我的帖子中查看我已更新 JSON 格式的编辑。我尝试使用 [mention]="items.attributes" 并尝试使用 [mentionConfig]="{ labelKey: 'User'}"。您能否建议我如何实现这一目标?
  • @JayeshVyas 你试过 [mentionConfig]="{ labelKey: 'attributes.User'}"
  • @JayeshVyas 看起来提到不支持嵌套对象属性作为 labelKey。这是提到的sourcecode,它设置 labelKey 而不考虑嵌套对象属性的可能性。如果是这种情况,您将不得不使用@Ryans 回答中提到的相同方法。使用这样的映射创建数组items = items.map((x) =&gt; x.attributes.User)
猜你喜欢
  • 2017-11-15
  • 1970-01-01
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 1970-01-01
  • 2021-04-27
相关资源
最近更新 更多