【问题标题】:How to trim whitespaces while setting data-automation-id dynamically如何在动态设置 data-automation-id 时修剪空格
【发布时间】:2020-02-05 06:28:30
【问题描述】:

我正在 Angular 中制作一个简单的时间选择小部件,以将我们当前的性能与之前的性能进行比较。我的小部件包含两个dropdown 列表和一些按钮和输入字段(忘记按钮和输入字段)。我的问题是关于这些下拉列表的测试。这是我的代码:

timeselector.component.html

<select data-automation-id="timeselection-mode-primary">
  <option *ngFor="let mode of modes" [attr.data-automation-id]="'options_' + mode">
    {{ mode }}
  </option>
</select>

<!--some input fields and toggle button goes here-->

<select data-automation-id="timeselection-mode-secondary">
  <option *ngFor="let mode of modes" [attr.data-automation-id]="'previous_options_' + mode">
    Previous {{ mode }}
  </option>
</select>

他们都在我的打字稿中从同一个数组中读取modes

timeselector.component.ts

modes=['Calendar year', 'Year-to-date', 'Quarter', 'Monthly Pipe', 'Weekly Sprint']

我的问题是,Calendar yearMonthly PipeWeekly Sprint 有空格。所以,这样我的data-automation-id 将如下:

options_Calendar yearoptions_Monthly Pipeoptions_Weekly Sprint

为了解决这个问题,我在每个选项中引入了index 值,如下所示:

<option *ngFor="let mode of modes; let i=index"
                [attr.data-automation-id]="'options_' +i">

<option *ngFor="let mode of modes; let i=index"
                [attr.data-automation-id]="'previous_options_' +i">

这也有效。但我的技术主管对这种索引方法不太满意。她希望我只使用mode。她告诉我使用truncatetrim 或任何现有的解决方案,但没有索引。

我知道如何使用truncatetrimsubString 等方法。但我无法弄清楚如何在运行时使用数据自动化 ID 来做到这一点。我尝试了其他一些解决方案,但没有奏效。请帮帮我。

小部件如下所示:

【问题讨论】:

    标签: angular typescript unit-testing


    【解决方案1】:

    如果要删除字符串之间的空格,可以将字符串传递给函数并获取split(带空格)和join(带破折号-)之类的,

      getModifiedText(mode){
        const splitMode = mode.split(' ');
        const joinMode = splitMode.join('-')
        return joinMode;
      }
    

    所以修改文件,如,

    component.html

    <select data-automation-id="timeselection-mode-primary">
      <option *ngFor="let mode of modes;" [attr.data-automation-id]="'options_'+ getModifiedText(mode)">
          {{ mode }}
      </option>
    </select>
    

    component.ts

      getModifiedText(mode){
        const splitMode = mode.split(' ');
        const joinMode = splitMode.join('-')
        return joinMode;
      }
    

    我已经给了splitMode.join('-'),您可以根据需要更改此部分。例如:splitMode.join('_')..

    正在工作Stackblitz here...

    【讨论】:

    • 这太棒了兄弟。其实我也打算这样做。但后来我想,当有预建的方法时,我们应该使用它们。但现在我只使用这个。当你在班加罗尔时告诉我。我会给你准备一顿丰盛的午餐:-)
    【解决方案2】:

    data-automation-id 的生成委托给控制器部分(TS 文件)而不是模板(HTML)怎么样?

    timeselector.component.ts,而不是拥有

    modes=['Calendar year', 'Year-to-date', 'Quarter', 'Monthly Pipe', 'Weekly Sprint']
    

    改用这个:

    
    modes = {
      name: 'Calendar year',
      id: 'options_calendar_year',
      ...
    }
    
    

    然后在timeselector.component.html 你可以拥有:

    <select data-automation-id="timeselection-mode-primary">
      <option *ngFor="let mode of modes" [attr.data-automation-id]="mode.id">
        {{ mode.name }}
      </option>
    </select>
    

    【讨论】:

    • 我非常感谢这个解决方案。让我实现它,对其进行审查和测试。然后我会回到你身边。请给我 10 分钟 :-)
    • 我和技术主管谈过话。我们不能改变modes 的结构。它来自外部来源。而且在未来的版本中,我可以有更多的选择,所以mode.id 会有太多的硬编码。
    • 1) 是的,您不能从外部源更改它,但您可以在代码中更改modes 的“表示形式”。当您尝试在选择时获得价值时,只需获得必要的东西。 2)您不必硬编码,您只需创建一个函数,该函数将根据模式名称自动生成 ID 并调用该函数。 :) 如果您发布有关如何使用 attr.data-automation-id 的代码也会很有帮助
    猜你喜欢
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2013-11-16
    • 2015-12-20
    • 2016-04-06
    • 2017-11-16
    • 2016-02-29
    相关资源
    最近更新 更多