0

如何使用丰富的 tect 控件中的 replaceItemValue 设置richText 值?

我在这里找到了这段代码:http: //www.bleedyellow.com/blogs/martin/entry/save_a_richtext_field_from_a_xpage_to_a_document?lang=en_us

var doc = configuratieformulieren.getDocumentByKey("ConfiguratieIVNL", true);
if(doc == null){
    return;
}else{    
    var titel = getComponent("inputTextIBPTitelIVNL").getValue();
    doc.replaceItemValue("IBPTitel",titel);    
   var inhoud = getComponent("inputRichTextIBPInhoudIVNL").getValue();
   if (inhoud != null){ 
   var contentType = doc.getMIMEEntity("IBPInhoud").getContentType();
   var encoding = doc.getMIMEEntity("IBPInhoud").getEncoding();
   var str = session.createStream();
   inhoud.toString();
   str.writeText(inhoud.toString());
   doc.getMIMEEntity("IBPInhoud").setContentFromText(str, contentType, encoding);    
 }

 doc.save(true, true);
}
sessionScope.put("FormulierIVNLInfoBeschPG","Lezen");

这是正确的吗?看起来此代码取决于该字段已存在的事实。如果该字段不存在,如何处理?是否有更简单的方法可以将字段值设置为富文本控件的内容?

4

2 回答 2

3

让数据源完成繁重的工作。有关原因的冗长而无聊(但彻底)的解释,请阅读这篇文章。但这里是快速版本:

不要使用:

getComponent("someID").getValue()

相反,使用:

someDataSource.getValue("someFieldName")

这始终是访问数据的一种更有效的方式:不必通过组件树来查找匹配项,而是直接进入数据源,如果您询问它的值是什么,组件无论如何都必须询问它。

同样,不要使用:

someDataSource.replaceItemValue("someFieldName", someValue)

相反,使用:

someDataSource.setValue("someFieldName", someValue)

后者在输入类型上更加灵活。数据源已经包含了根据值是文本、日期、数字、富文本、文件上传等来确定要做什么的所有逻辑。无需在您自己的代码中复制任何逻辑。

因此,如果目标是根据当前文档中的数据更新单独的文档,只需定义一个单独的文档数据源,指向要更新的文档即可。那么它实际上就是这么简单:

configData.setValue("RichTextData", currentDocument.getValue("RichTextData"));
configData.save();

使用上面的代码,如果您在当前文档上指定的字段是富文本,那么它在另一个文档上创建的项目将是富文本。如果它是当前文档上的任何其他类型,则它将是其他文档上的相同类型。使用getValue()and setValue(),您不必注意数据类型......数据源会为您处理所有这些。

对于奖励积分,范围configDataapplicationScope以便立即为所有用户缓存对它的任何更新......或者sessionScope如果您正在更新的文档是特定于用户的。

于 2013-04-03T01:34:47.110 回答
0

我能够解决我的原始问题。为了扩展我的问题,我在使用表单 A 上的对话框从表单/文档 A 创建表单/文档 B 时遇到问题。发生的事情是对表单 B 的任何更改都将保存到文档 A 的数据源中。

我在表格 B 的数据源上找到了 ingoreRequestParams,设置它并解决了表格 B 写入表格 A 文档的问题。

于 2013-04-03T12:13:58.497 回答