钛加速器; CommonJS 没有方法

Posted

技术标签:

【中文标题】钛加速器; CommonJS 没有方法【英文标题】:Titanium Appcelerator; CommonJS has no method 【发布时间】:2014-10-21 05:02:40 【问题描述】:

我对 Appcelerator 还很陌生,我尝试导入自己的 commonJS 库。我按照说明进行了

http://docs.appcelerator.com/titanium/latest/#!/guide/CommonJS_Modules_in_Titanium

并创建了一个名为“logger.js”的新文件,代码如下:

exports.info = function(str) 
  Titanium.API.info(new Date()+': '+str);
;

现在我只是尝试使用以下代码执行此代码:

var logger = require('logger');
logger.info('TEST TEST TEST');

就像在示例中一样。他找到了文件,但不认识我的方法,我得到以下异常:

[ERROR] :  TiExceptionHandler: (main) [602,602] ----- Titanium javascript Runtime Error -----
[ERROR] :  TiExceptionHandler: (main) [0,602] - In alloy/controllers/index.js:100,12
[ERROR] :  TiExceptionHandler: (main) [0,602] - Message: Uncaught TypeError: Object function Controller() 
[ERROR] :  TiExceptionHandler:     function logOutput(str) 
[ERROR] :  TiExceptionHandler:         Titanium.API.info(str);
[ERROR] :  TiExceptionHandler:     
[ERROR] :  TiExceptionHandler:     require("alloy/controllers/BaseController").apply(this, Array.prototype.slice.call(arguments));
[ERROR] :  TiExceptionHandler:     this.__controllerPath = "login";
[ERROR] :  TiExceptionHandler:     if (arguments[0]) 
[ERROR] :  TiExceptionHandler:         __processArg(arguments[0], "__parentSymbol");
[ERROR] :  TiExceptionHandler:         __processArg(arguments[0], "$model");
[ERROR] :  TiExceptionHandler:         __processArg(arguments[0], "__itemTemplate");
[ERROR] :  TiExceptionHandler:     
[ERROR] :  TiExceptionHandler:     var $ = this;
[ERROR] :  TiExceptionHandler:     var exports = ;
[ERROR] :  TiExceptionHandler:     exports.destroy = function() ;
[ERROR] :  TiExceptionHandler:     _.extend($, $.__views);
[ERROR] :  TiExceptionHandler:     exports = logOutput;
[ERROR] :  TiExceptionHandler:     _.extend($, exports);
[ERROR] :  TiExceptionHandler:  has no method 'info'
[ERROR] :  TiExceptionHandler: (main) [1,603] - Source:     logger.info("TEST TEST TEST");
[ERROR] :  V8Exception: Exception occurred at alloy/controllers/index.js:100: Uncaught TypeError: Object function Controller() 
[ERROR] :  V8Exception:     function logOutput(str) 
[ERROR] :  V8Exception:         Titanium.API.info(str);
[ERROR] :  V8Exception:     
[ERROR] :  V8Exception:     require("alloy/controllers/BaseController").apply(this, Array.prototype.slice.call(arguments));
[ERROR] :  V8Exception:     this.__controllerPath = "login";
[ERROR] :  V8Exception:     if (arguments[0]) 
[ERROR] :  V8Exception:         __processArg(arguments[0], "__parentSymbol");
[ERROR] :  V8Exception:         __processArg(arguments[0], "$model");
[ERROR] :  V8Exception:         __processArg(arguments[0], "__itemTemplate");
[ERROR] :  V8Exception:     
[ERROR] :  V8Exception:     var $ = this;
[ERROR] :  V8Exception:     var exports = ;
[ERROR] :  V8Exception:     exports.destroy = function() ;
[ERROR] :  V8Exception:     _.extend($, $.__views);
[ERROR] :  V8Exception:     exports = logOutput;
[ERROR] :  V8Exception:     _.extend($, exports);
[ERROR] :  V8Exception:  has no method 'info'

我想这很简单,但我不知道我的错在哪里。

提前致谢

【问题讨论】:

【参考方案1】:

您展示的代码对我有用。你在 app/lib 目录下创建了 logger.js 吗?

也许您应该尝试注释掉 index.js 中的 logger.info(...) 行,以确保您正在查看正确的问题;-)

您使用的是哪个版本的 Titanium Studio? - 在哪个操作系统上?

/约翰

【讨论】:

您好,该文件位于 app/controllers 下。如果我取消注释 logger.info(...) 行,我没有得到任何异常。 我使用的是 Windows 7、Titanium Studio 3.3.0 和 Titanium SDK 3.3.0.GA。我添加了这一行Ti.API.log("Logger: " + logger);,我可以看到他找到了我的文件,甚至输出了我的方法...e.info=function(t)Titanium.API.info(new Date+": "+t)... 好的,第一件事是这些类型的 CommonJS 库应该放在 app/lib 下,据我所知。但是,这似乎不是您的问题 - 只是一种更好的做法;-) 我认为您的项目可能有问题。所以试试这个: 1. 创建一个新的 Alloy 项目,并预览它(在设备上或在模拟器/Genymotion 中)。 2. 按预期工作后,将您的库和两行添加到 index.js。会发生什么? ... 以及指向另一个关于放置 commonjs 的问题的指针:developer.appcelerator.com/question/150114/…。顺便说一句,如果您还没有注册成为 Appcelerator 开发人员,我强烈建议您这样做。【参考方案2】:

最好导出主对象和访问信息功能(Titanium Good Practices)。

logger.js

var logger = (function()

    var self = ;

    self.info = function info(str)
    
        Ti.API.info(new Date()+': '+str);
    ;

    return self;

());

module.exports = logger;

file.js 你需要记录器的地方

var loggerObject = require('logger.js'); // (both files are at the same Path)
loggerObject.info("TEST TEST");

希望我的回答对你有帮助;)

【讨论】:

嗨,很遗憾我也遇到了同样的异常 :-(. 您的项目是合金类型而不是移动项目,因此您必须阅读此链接Titanium Documentation【参考方案3】:

通常我们把这种额外的函数文件放在lib目录下,所以你应该在app目录下创建一个文件夹并将其命名为lib,然后将logger.js文件放在该文件夹下,然后再试一次。

【讨论】:

我也这样做了,但遗憾的是结果相同 :-(【参考方案4】:

我终于明白了。问题是我正在使用“Alloy Project”,就像“Alejandro F. Carrera”提到的那样。我只需要使用Alloy.createController(); 就可以了。

var logger = Alloy.createController('logger');
logger.info('TEST TEST TEST');

现在可以了。

感谢大家为我指明正确的方向

【讨论】:

以上是关于钛加速器; CommonJS 没有方法的主要内容,如果未能解决你的问题,请参考以下文章

钛加速计zipfile模块:提取方法

有没有办法覆盖本机加速键?

类似于360软件小助手里的一键加速功能的软件有没有?

有啥方法可以加速 maven 构建?

有没有免费的加速器?

相对于标准代码测试 simd 加速的正确方法是啥