-3

私は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).

私の間違いは何ですか?

4

6 に答える 6

5

開発に移る前に、Titanium の CommonJS モジュールについて十分に理解する必要があります。そうすれば、あなたにとってはもっと簡単になります。require 関数も参照してください。

あなたのエラーに行きましょう。[ERROR] [object Database]' is not a constructor (evaluating 'new Database()') at app.js (line 3)作成したモジュールがコンストラクターではないことを意味します。コンストラクター関数が値を返さない場合があります。CommonJS モジュールの簡単な使い方を読んでください。きっとあなたの問題を解決してくれるでしょう。

もう 1 つの方法があります。app.js に Database.js ファイルを含めることができます。何も返す必要はなく、require 関数を使用する必要もありません。include メソッドを使用するだけです。app.js 内に記述するだけTi.include('Database.js');で、Database.js ファイル内のすべてのグローバル変数と関数にアクセスできます。

于 2013-03-04T12:01:29.987 に答える
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();
于 2015-01-21T12:29:12.897 に答える
1

編集: この回答は JavaScript の一般的なものであり、Appacelerator Titanium 向けではありません。


includeそのようなものやrequirejavascriptにはありません。一方、次のいずれかを行うことができます

スクリプトの前にスクリプト タグを含めて、Database.js を含めます。

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

また

動的に追加する

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);
}
于 2013-03-03T11:38:33.890 に答える
0

問題は、変数名「データベース」の使用法にあるようです。もしかしたら、どこかで名前の談合があるかもしれません。

require の使い方が js の基本的な概念ではないことを知らなかったのは残念です。

于 2013-03-03T11:48:24.113 に答える
0

ここで簡単に推測します。CommonJS を使用する場合は、モジュールの外部で利用できるものを指定する必要があります。データベースの「オブジェクト」を作成したことをレイアウトする方法は、次を追加する必要があります。

module.exports = Database;

モジュールのどこかに。私はいつもそれらを最後に置きます-しかし、それが要件であるかどうかはわかりません.

次のように指定して、個々の関数をモジュールの外部で使用可能にすることもできます。

exports.getMyDatabase = getMyDatabase;

「getMyDatabase」は、モジュールで指定した関数です。この方法を使用して、一部の関数の特定の実装の詳細を外部から「隠し」、開発者が呼び出せるようにしたい関数を利用できるようにします;-)

/ジョン

于 2015-01-23T17:32:14.207 に答える
-4

これはrequire jsの正しい使い方だと思います:

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

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

于 2013-03-03T11:35:54.327 に答える