如何制作 Netlify CMS 的列表小部件 returns 数量

How to make Netlify CMS' list widget returns number

我想为我的 Jekyll 网站使用 Netlify CMS,我有这样的布局:

{% for skills in page.skills %}
    <div class="guide-skill">
        <div class="guide-skill-fill">
            {% for i in (1..15) %}
            <div class="{% if skills.levels contains i %}fill{% endif %} skill-check"><p>{{ i }}</p></div>
            {% endfor %}
        </div>
    </div>
{% endfor %}

以及我在使用此布局的文本编辑器中编写的页面首页:

skills:
  - levels:
      - 1

代码运行良好,fill class 已正确添加。

但是当我将 Netlify CMS 与列表小部件一起使用时,它 returns 字符串而不是 levels 列表中的数字,如下所示:

skills:
  - levels:
      - '1'

所以代码不起作用,如何使它成为 returns 数字?

我试过的

我的配置

- label: "Hero Skills"
  name: "skills"
  widget: "list"
  required: false
  fields:
      - {label: "Skill Number", name: "number", widget: "number"}
      - {label: "Levels", name: "levels", widget: "list"}

你不能像这样使用数学过滤器强制将此字符串转换为数字吗?

{{ yourstring | divided_by:1 }}

来源:https://help.shopify.com/themes/liquid/filters/math-filters#divided_by

更新

由于之前的方案不太好实现,所以我换了一个角度来解决问题。以下代码不假定级别为数字:

{% for skills in page.skills %}
    <div class="guide-skill">
        <div class="guide-skill-fill">
            {% assign all_levels = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15" | split: ',' %}
            {% for level in all_levels %}
            <div class="{% if skills.levels contains level %}fill{% endif %} skill-check"><p>{{ level }}</p></div>
            {% endfor %}
        </div>
    </div>
{% endfor %}

使用 NetlifyCMS 'Number' widget 允许将数字写入字符串或数字值。

如果您的前言获取字符串值,您应该使用 valueType

- label: "Hero Skills"
  name: "skills"
  widget: "list"
  required: false
  fields:
    - {label: "Skill Number", name: "number", widget: "number", valueType: "int", default: 1}
    - {label: "Levels", name: "levels", widget: "list"}

None 的内置小部件可以输出数字列表(不是字符串),但是当内置小部件不起作用时,您始终可以使用自定义小部件。自定义小部件是 React 组件,我们为那些不使用模块系统的人发布了全局挂钩(createClassh)。更多文档:https://www.netlifycms.org/docs/custom-widgets/#registerwidget

对于您的特定情况,您可以修改文档示例中的类别小部件,使其仅处理数字并输出它们。在 Netlify CMS 的 index.html 文件的 body 标签末尾添加:

<script>
  var NumberListControl = createClass({
    handleChange: function(e) {
      var value = e.target.value.replace(/[^0-9, ]/, '');
      this.props.onChange(value.split(',').map(function(val) {
        var trimmed = val.trim();
        return trimmed ? parseInt(trimmed, 10) : trimmed;
      }));
    },

    render: function() {
      var value = this.props.value;
      return h('input', {
        type: 'text',
        value: value ? value.join(', ') : '',
        onChange: this.handleChange,
        className: this.props.classNameWrapper,
      });
    }
  });

  var NumberListPreview = createClass({
    render: function() {
      return h('ul', {},
        this.props.value.map(function(val, index) {
          return h('li', {key: index}, val);
        })
      );
    }
  });

  CMS.registerWidget('number_list', NumberListControl, NumberListPreview);
</script>