Javascript:在Appcelerator Titanium中使用require

时间:2013-03-03 11:32:42

标签: javascript titanium appcelerator titanium-mobile

我对javascript很新,我正在努力解决一个简单的问题。我必须将代码分成单独的文件。作为一个例子,我有一个名为Database.js的文件。在该文件中,我有以下几行:

function Database(){
    //someStuff
    this.fetchAll = function(){
        //some stuff
        return something;
    }
}

现在我想在app.js文件中使用Database.js代码。所以我在app.js中编写了以下代码:

var Database = require('Database');
var myDB = new Database();
var result = myDB.fetchAll();

但是,我收到错误Script Error = '[object Database]' is not a constructor (evaluating 'new Database()') at app.js (line 3).

我的错误是什么?

6 个答案:

答案 0 :(得分:5)

在进入开发之前,您需要彻底了解CommonJS Modules in Titanium。那么对你来说会更简单。另请参阅require function

让我们来看看你的错误。 [ERROR] [object Database]' is not a constructor (evaluating 'new Database()') at app.js (line 3)表示您创建的模块不是构造函数。您的构造函数可能不会返回任何值。 阅读simple usage of CommonJS module 。我相信它会解决你的问题。

还有另一种方法,您可以在app.js中包含Database.js文件。您不需要返回任何内容,也不需要使用require函数。您只需使用include method即可。只需在app.js中编写Ti.include('Database.js');,就可以访问Database.js文件中的所有全局变量和函数

答案 1 :(得分:2)

这个问题已经陈旧但尚未得到解答。所以我只会为在这里访问的人提供答案。

您必须将您的功能导出为全局。为此,您将声明如下

exports.fetchAll = function Database(){
  //some stuff
  return something;
};

您还可以声明该函数,以便它可以在文件

中全局使用,也可以在本地使用
var fetchAll = function Database(){
  //some stuff
  return something;
};
exports.fetchAll = fetchAll;

然后假设文件名是Database并且它与app.js在同一个文件夹中,您可以使用它如下所示

var Database = require('Database');
var result = Database.fetchAll();

答案 2 :(得分:1)

编辑:这个答案是javascript一般的,它不是面向Appacelerator Titanium。


javascript中没有此类includerequire。另一方面,您可以执行以下某项操作

在脚本之前加入脚本标记以包含Database.js

<script type="text/javascript" src="Database.js" >

OR

动态添加

function loadScript(url, callback)
{
    // adding the script tag to the head as suggested before
   var head = document.getElementsByTagName('head')[0];
   var script = document.createElement('script');
   script.type = 'text/javascript';
   script.src = url;

   // then bind the event to the callback function 
   // there are several events for cross browser compatibility
   script.onreadystatechange = callback;
   script.onload = callback;

   // fire the loading
   head.appendChild(script);
}

答案 3 :(得分:0)

问题似乎是使用变量名'Database'。也许某个地方存在名称勾结。

对不起,我不知道require的用法不是js的基本概念。

答案 4 :(得分:0)

在这里快速猜测一下。如果您使用CommonJS,那么您必须告诉模块外部应该有什么。你的方式是你已经建立了数据库&#34;对象&#34;你需要添加:

module.exports = Database;

你模块中的某个地方。我总是把它们放在最后 - 但不确定这是一个要求。

您还可以通过指定以下内容在模块外部使用单个功能:

exports.getMyDatabase = getMyDatabase;

其中&#34; getMyDatabase&#34;是您在模块中指定的功能。我用这种方式来隐藏&#34;来自外部的某些功能的某些实现细节,只是提供我希望开发人员能够调用的功能; - )

/约翰

答案 5 :(得分:-4)

我认为这是require js的正确用法:

require(["Database"], function() {
    var myDB = new Database();
    var result = myDB.fetchAll();
});

http://requirejs.org/docs/jquery.html