如何使Netlify CMS的列表小部件返回数字

问题描述 投票:3回答:3

我想在我的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类正确添加。

但是当我使用Netlify CMS和列表小部件时,它会将字符串而不是数字返回到levels列表,如下所示:

skills:
  - levels:
      - '1'

所以代码不起作用,如何让它返回数字?

What I've tried

  • 引用i,但它给了我一个错误
  • 使用valueType : "int",没有用

My config

- label: "Hero Skills"
  name: "skills"
  widget: "list"
  required: false
  fields:
      - {label: "Skill Number", name: "number", widget: "number"}
      - {label: "Levels", name: "levels", widget: "list"}
jekyll netlify netlify-cms
3个回答
6
投票

内置窗口小部件都不能输出数字列表(不是字符串),但是当内置窗口小部件不起作用时,您总是可以使用自定义窗口小部件。自定义小部件是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>

3
投票

使用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"}

0
投票

难道你不能只使用数学过滤器强制这个字符串转换为数字,像这样吗?

{{ yourstring | divided_by:1 }}

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

UPDATE

由于之前的解决方案不容易实现,我选择了另一个角度来解决问题。以下代码不假定级别是数字:

{% 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 %}
© www.soinside.com 2019 - 2024. All rights reserved.