钛加速器; 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 没有方法的主要内容,如果未能解决你的问题,请参考以下文章