【问题标题】:Angular 2 Accent FoldingAngular 2 重音折叠
【发布时间】:2017-02-09 16:00:32
【问题描述】:

您好,我正在努力解决我遇到的问题:

我有一个带有自动完成功能的输入字段。我想为它做重音折叠。

例如

当我使用术语 mun 进行搜索时,这两个词应该会出现 Dortmund & München

我目前拥有的是,如果我使用术语 mün 进行搜索,它会列出 Dortmund。但不是München

accentMap = {
  'ü': 'u',
  'Ü': 'u',
  'ä': 'a',
  'Ä': 'a',
  'ö': 'o',
  'Ö': 'o'
};

let str = '';
for(let i = 0; i < input.length; i++) {
  str += this.accentMap[input.charAt(i)] || input.charAt(i);
}

然后我使用 str 调用一个 API,该 API 返回这些条目,如 DortmundMünchen

【问题讨论】:

  • 您使用的是哪种typeahead?它是由任何库提供的吗?
  • ng2 bootstrap typeahead
  • 我阅读了他们的文档并找到了typeaheadLatinize 输入。在这种情况下它不起作用吗?
  • 不,很遗憾它没有
  • 如果我相信documentation,内置的typeaheadLatinize 选项正好解决了这个问题,它应该默认启用。因此,您不必为此编写任何自定义代码。如果它不起作用,您可能应该向 Angular 2 Bootstrap 组件的作者提出问题。

标签: angular typescript typeahead


【解决方案1】:

这是因为您的代码总是将“mün”转换为“mun”,因此,该字符串在“Dortmund”中找到,但在“München”中找不到。

要解决这个问题,首先将您的代码包装在一个可重用的函数中:

function removeAccents(input: string){
    let accentMap = {
      'ü': 'u',
      'Ü': 'u',
      'ä': 'a',
      'Ä': 'a',
      'ö': 'o',
      'Ö': 'o'
    };

    let str = '';

    for(let i = 0; i < input.length; i++) {
      str += this.accentMap[input.charAt(i)] || input.charAt(i);
    }

    return str;
}

然后,当您想将输入与单词列表进行比较时,请使用如下语句:

if(removeAccents(input) == removeAccents(word)){
   // The input matched the word
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 2016-12-09
    • 2016-12-19
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多