【问题标题】:Sencha Touch 2: Not able to call a function inside controller from a java class only in production versionSencha Touch 2:仅在生产版本中无法从 Java 类调用控制器内部的函数
【发布时间】:2013-02-15 19:29:30
【问题描述】:

背景: 我正在 Android 设备的 web 视图中加载一个 sencha 移动站点,并从 java 类访问在 sencha 控制器中声明的函数 如下。

webView.loadUrl("javascript:getMeNumbers();");

这个函数在我的控制器中声明

getMeNumbers : function(value) {
  console.log('Controller: Function called >> getMeNumbers');
}

问题:当我在开发模式下运行这个应用程序时,我可以从 java 类调用这个控制器函数。 但是,一旦我创建生产版本并尝试从 java 类调用此控制器函数,它就会开始给我错误:

'ReferenceError: Can't find variable: getMeNumbers at undefined:1''` in the console.

任何想法为什么它不能在生产版本中工作而只能在开发版本中工作?任何想法或指示都会有很大帮助。

谢谢

【问题讨论】:

    标签: extjs sencha-touch sencha-touch-2


    【解决方案1】:

    控制器函数不是全局函数,所以不能直接调用。

    假设你的应用名称是APP,你的控制器是“MainController”,你可以试试这个:

    webView.loadUrl("javascript:APP.app.getControllerInstances()['APP.controller.MainController'].getMeNumbers()");
    

    另一种方法是使用路由:在您的控制器中,添加路由配置:

    routes:{
      'getmenumbers': 'getMeNumbers'
    }
    

    然后:

    webView.loadUrl("#getmenumbers");
    

    【讨论】:

    • 非常感谢您的解释。我正在使用全局函数,但不知何故,在开发生产版本后,它们失去了全局上下文。这种方法确实有帮助,现在我能够理解如何从 webview 调用函数,即使它不是全局函数。再次感谢。
    【解决方案2】:

    构建压缩 js/css 的应用程序时,它会重命名函数、变量名称以缩短名称。它通常会删除压缩器认为无用的功能。通常这样做是为了减小文件的大小。

    因此,在您的情况下,压缩器也可能已将函数重命名为其他内容,或者如果没有从任何 js 文件中调用它,则最不可能将其删除。

    你可以做的是识别js文件压缩后的函数名。尝试搜索函数体。

    【讨论】:

    • 感谢您的回复,phazor。我已经在压缩的 app.js 中搜索了 functionName,并且能够在文件中完整地找到该函数。还有其他线索吗?
    • 它是一个全局函数,在控制器 Ext.define 外部声明。你认为这可能是原因吗?
    • 这两个函数名称是否与您在刚刚构建的 js 中调用的函数名称匹配?
    • 感谢 Phazor 的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多