向 jsonjava 对象添加函数并从 xpages 控件调用它

adding function to jsonjava object and calling it from xpages control

我正在尝试向 JSONJavaObject 添加函数并从 xpage 上的控件调用它。

到目前为止我有:

json = (JsonJavaObject) JsonParser.fromJson(factory, colJson);                      
String func = "function () { alert('you clicked?'); }";                         
json.put("onClick", new JsonReference(func) );

在第一行中,我从 Notes 视图的列中添加了键值对。 在第二行中,我将函数定义为字符串。 在最后一行中,我将转换后的字符串作为函数放在 jsonjava 对象中。

我在以下博客 post 中读到了这方面的内容: http://camerongregor.com/2016/01/19/doublequoteavoidance/

在下一步中,我将函数绑定到例如一个按钮控件如下:

<xp:button value="Label" id="button1">
<xp:eventHandler event="onclick" submit="false">
<xp:this.script><![CDATA[obj.onClick]]></xp:this.script>
</xp:eventHandler>
</xp:button>

obj是JSONJava对象在SSJS中的表示。

但是没有成功。有人知道我如何调用对象中的函数吗?

obj.onClick 是否已经为您提供了 Java class 返回的函数的句柄?如果是,那么您应该可以使用 callapply 方法调用它,这些方法在 JavaScript:

中可用
obj.onClick.call();
obj.onClick.apply();

可以在此处找到有关这两种方法的更多详细信息:What is the difference between call and apply?

我希望我在这里能说得通,如果有什么需要澄清的,请告诉我。

如果您只是想动态输出按钮事件的客户端脚本,那么您根本不需要使用 JsonReference。你可以只使用一个字符串。

在我的博客文章中,我可能没有说清楚为什么我需要使用 Json参考。我在渲染自定义 UIComponent 的过程中使用它,这个过程的一部分需要生成一个 Json 对象客户端。为此,我像您一样创建了 JsonJava 对象,然后要求使用 'toJson' 方法将其转换为字符串。我的问题是,当我要求整个对象成为一个字符串时,该对象的每个 属性 都是一个字符串,将以双引号开头和结尾。我需要确保本应成为函数的属性不以“”开头和结尾。通过使用 JsonReference,JsonGenerator 意识到我打算不包含这些双引号。

在您的情况下,您似乎只是在尝试动态确定 onClick 会发生什么。为此,您可以简单地使用 String 而不是 JsonReference。包含 'function() {}' 是不必要的,因为这将在页面末尾呈现事件处理程序时生成。

例如这里是 Json Java 对象

JsonJavaObject obj = new JsonJavaObject();
String func = " alert('you clicked?'); ";
obj.put("onClick", func);   
return obj;

这里是按钮:

<xp:button id="button1" value="Alert Me">
    <xp:eventHandler event="onclick" submit="false"
        script="#{javascript: myBean.myObject.get('onClick')}">
    </xp:eventHandler>
</xp:button>

这应该会让您看到 'you clicked?' 警报的最终结果。

您还可以使用 'view Source' 或您最喜欢的 Web 浏览器开发人员工具在页面末尾附近的脚本块中检查所有这些是如何生成的:

function view__id1__id2_clientSide_onclick(thisEvent) {
 alert('you clicked?'); 

}

XSP.addOnLoad(function() {
XSP.attachEvent("view:_id1:_id2", "view:_id1:button1", "onclick",     
  view__id1__id2_clientSide_onclick, false, 2);
}); 

如果有任何不清楚的地方,请告诉我,希望对您有所帮助!