“未捕获类型错误 - ”没有方法'apply'“ - 实现CQ5对话框监听器时

时间:2013-12-07 22:01:01

标签: extjs cq5 aem

我正在尝试根据对话框中另一个字段的值更新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

1 个答案:

答案 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的形式,这是更清晰的解决方案。