我正在尝试根据对话框中另一个字段的值更新dialog.xml
中的字段。它在我使用CRXDELite直接添加代码时起作用,但是当我从Eclipse通过Maven部署时失败。
我的直觉说这是一个格式化问题,因为在将JS粘贴到CRXDELite之前,我通常使用Mac中的纯文本编辑器。
接收的代码和错误如下。这是使用CQ5.5。
dialog.xml:
<options jcr:primaryType="cq:WidgetCollection">
<contentvideo jcr:primaryType="nt:unstructured"
text="valuetocheckfor"
value="valuetocheckfor"/>
<product jcr:primaryType="nt:unstructured"
text="duh"
value="duh"/>
</options>
<listeners jcr:primaryType="nt:unstructured"
selectionchanged="function(box,value){
var ans = box.findParentByType('dialog').form.findField('./fieldtochange');
disableAnsText(ans,value);
}
function disableAnsText(ans,value) {
if(value == 'valuetocheckfor') {
console.log('anstype value - '+value);
ans.setDisabled(true);
ans.getEl().up('.x-form-item').setDisplayed(false);
} else {
ans.getEl().up('.x-form-item').setDisplayed(true);
ans.setDisabled(false);
}
}"/>
浏览器中的例外:
Uncaught TypeError: Object function(box,value){...my function } has no method 'apply' widgets.js:1249
答案 0 :(得分:3)
selectionchanged
属性希望您传递一个匿名函数,因此它可以apply
方法。您已经放置了一些包含两个定义的Javascript代码,一个接一个:
function(box,value) {
...
}
function disableAnsText(ans,value) {
...
}
此代码片段不是函数声明,因此CQ无法调用apply
因此异常。作为快速修复,您可以在匿名函数中移动disableAnsText
函数:
function(box,value) {
function disableAnsText(ans,value) {
// disableAnsText function body
}
// anonymous function body
}
请注意,对话框配置的这个片段非常难以理解。将整个逻辑移到client library是个好主意。窗口小部件侦听器配置应该只包含对clientlib中声明的函数的调用。
或者,您可以考虑将此逻辑重写为widget plugin的形式,这是更清晰的解决方案。