1

这一直让我发疯-希望有人可以帮助我。

我有一个名为“书籍”的多字段组件,带有一个文本字段:“标题”。

一切似乎都在工作;对话框包含多字段,然后我添加两个标题字段,然后输入“title1”和“title2”。

然后在 HTML 本身中我去:

<div data-sly-repeat="${properties.books}">
  <p>${item}</p>
  <p>${itemList.index</p>
  <p>${item.title}</p>
</div>

我没有得到的是, ${item} 正确地给了我: {"title": "title1"} {"title": "title2"}

并且 ${itemList.index} 正确地给了我:0 1

但 ${item.title} 一直出现空白。我也尝试了 ${item["title"]} 并且它也出现了空白。

我在这里做错了什么?在我绝望中,我考虑使用

<div data-title="${item}"></div>

然后使用 JS 处理 JSON 对象,但我真的不想这样做。

请有人帮忙!

4

1 回答 1

2

看起来您的books属性是JSON数组字符串或多值属性,每个值都是JSON对象字符串;

解析属性的最简单方法是通过 JS 模型,如下所示:

您可以简化此脚本以匹配您的特定情况,我将其用于多值和非多值字符串属性。

/path/to/your-component/model.js

"use strict";
use(function () {

    // parse a JSON string property, including multivalued, returned as array
    function parseJson(prop){
        if(!prop) return [];
        var result =[];
        if(prop.constructor === Array){
            prop.forEach(function(item){
                result.push(JSON.parse(item));
            });
        }
        else {
            var parsed = JSON.parse(prop);
            if(parsed.constructor === Array){
                result = parsed;
            }
            else result = [parsed];
        }
        return result;

    }

    var $books = properties.get("books", java.lang.reflect.Array.newInstance(java.lang.String, 1));
    var books = parseJson($books);

    return {
        books: books
    }

});

/path/to/your-component/your-component.html

<sly data-sly-use.model="model.js"/>
<div data-sly-repeat="${model.books}">
  <p>${item}</p>
  <p>${itemList.index</p>
  <p>${item.title}</p>
</div>
于 2018-01-17T17:42:16.737 回答