Draft.js。如何从ContentState

时间:2017-09-24 23:52:59

标签: javascript reactjs draftjs

从官方文档中我了解了两种方法:通过其键获取实体并获取最后创建的实体。在我的例子中,我还需要一种方法来访问当前ContentState中的所有实体。 有没有什么方法可以执行此操作?如果没有,是否有一个可以提供所有实体密钥?

6 个答案:

答案 0 :(得分:7)

const getEntities = (editorState, entityType = null) => {
    const content = editorState.getCurrentContent();
    const entities = [];
    content.getBlocksAsArray().forEach((block) => {
        let selectedEntity = null;
        block.findEntityRanges(
            (character) => {
                if (character.getEntity() !== null) {
                    const entity = content.getEntity(character.getEntity());
                    if (!entityType || (entityType && entity.getType() === entityType)) {
                        selectedEntity = {
                            entityKey: character.getEntity(),
                            blockKey: block.getKey(),
                            entity: content.getEntity(character.getEntity()),
                        };
                        return true;
                    }
                }
                return false;
            },
            (start, end) => {
                entities.push({...selectedEntity, start, end});
            });
    });
    return entities;
};

答案 1 :(得分:1)

我如何获取所有实体键:

password = passwordtextField.text

Class A{
var password = ""
@IBOutlet weak var passwordTextField:UITextField!

//save function
password = passwordtextField.text

//pass the data to next class to complete registration
let vc = storyboard?.instantiateViewController(withIdentifier: "BControllerid") as! BViewController
  vc.passwordB = password

}

Class BViewController{
var passwordB = ""

//viewDiLoad
request.body = ["password" : passwordB]
//call the request
}

结果:

const contentState = editorState.getCurrentContent()
const entityKeys = Object.keys(convertToRaw(contentState).entityMap)

然后,您可以调用[0, 1] 方法来获取响应实体。

getEntity(key)的外观如下:

enter image description here

答案 2 :(得分:1)

Bao,您会在名为“ blocks”的键中找到它。

convertToRaw(contentState).blocks.map(el=>el.text)
它将为您提供原始文本数组。

答案 3 :(得分:0)

不幸的是,您建议使用convertToRaw的方法不起作用,因为它将所有键重新索引为[“ 0”,..,“ n”],但是当您使用编辑器时,实际键会有所不同。新的> n将被添加,未使用的将被省略。

答案 4 :(得分:0)

const rawState = convertToRaw(contentState) const { entityMap } = rawState;

此entityMap将具有所有实体的列表。但这是一个昂贵的转换。因为,它将把整个东西变成原始的。更好的方法是遍历块并检查实体。

答案 5 :(得分:0)

您必须查看每个字符:

    const { editorState } = this.state; // assumes you store `editorState` on `state`
    const contentState = editorState.getCurrentContent();

    let entities = [];
    contentState.getBlockMap().forEach(block => { // could also use .map() instead
      block.findEntityRanges(character => {
        const charEntity = character.getEntity();
        if (charEntity) { // could be `null`
          const contentEntity = contentState.getEntity(charEntity);
          entities.push(contentEntity);
        }
      });
    });

然后您可以通过以下方式访问它:

    entities.forEach((entity, i) => {
      if (entity.get('type') === 'ANNOTATION') {
        const data = entity.get('data');
        // do something
      }
    })