0

嗨,最好的同事,

我正在结合 Mootools 做一些面向对象的 Javascript 的经验,并创建一个用于锻炼的 todolist。我有以下问题。

我有一个名为数据库的类,看起来如下

var Database = new Class({

initialize:function(db){
    this.db = db;
    this.prepareDatabase();
    this.createTable();
},

/*
 * Creates the todo database
 * @return {object Database}
 * alDone ensures that the function will be called once, because we only want one database
 * with the name 'Todo' 
 */
prepareDatabase:function(){
    var alDone = false;

    if(!alDone){
     var dbSize = 5 * 1024 * 1024; // 5MB
     this.db = openDatabase("Todo", "1.0", "Todo manager", dbSize);

    }else{
        alDone = true;
    }
},

/*
 * Creates table 'todo'
 * alDone ensures that the function will be called once, because we only want one table
 * with the name 'todo' 
 */
createTable:function(){
    var alDone = false;

    if(!alDone){
        this.db.transaction(function(tx){
            tx.executeSql("CREATE TABLE IF NOT EXISTS todo(ID INTEGER PRIMARY KEY ASC, title TEXT, description TEXT, isDone INTEGER, date DATETIME)", [])
        });
    }else{
        alDone = true;
        console.log("functie createTable is al aangeroepen");
    }
},  

});

我创建了一个类 todo。我想要实现的目标是创建一个数据库实例并在 todolist 类的方法中调用它。如果有人可以帮助我解决这个问题,我将不胜感激。

提前Tnx。

我的 todolist 类如下所示。

var Todo = new Class(
{
initialize: function(title,description,isDone,date){
    this.title = title;
    this.description = description;
    this.isDone = isDone;
    this.date = date;
},

getTitle:function()
{       
    return this.title;  
},

getDescription:function()
{
    return this.description;
},

getIsDone:function()
{
    return this.isDone;
},

setIsDone:function(value)
{
    this.isDone = value;
},

});
4

1 回答 1

1

我不明白你在这里要做什么,但这里有一些错误:

  1. 在类中Database,您在构造函数中获取db参数并将其设置为类属性名称 db: - 然后通过将其设置为this.db = db;调用prepareDatabasewhich 来覆盖它 - 那么如果在下一个操作中覆盖它,为什么还要发送构造函数参数呢?this.dbopenDatabase("Todo", "1.0", "Todo manager", dbSize);db
  2. 您想要这些函数prepareDatabase并且createTable将被调用一次,因此您设置了一个变量alDone- 但该变量是函数的本地变量,因此在每次调用其中一个函数alDone时将始终为 false 并被执行 - 我猜你想要的是设置一个类变量对函数的每次调用都会“记住”它的状态,因此您可以执行以下操作:

结束列表项(这是 stackoverflow 错误 :))

prepareDatabase:function(){
            if(!this.alDone){
             this.alDone = true;
             var dbSize = 5 * 1024 * 1024; // 5MB
             this.db = openDatabase("Todo", "1.0", "Todo manager", dbSize);
            }
        },

然后你又不能调用 this.alDone 两次,所以你需要在另一个函数(createTable)中更改名称

继续: 如果你想让你的数据库类“全局”(正确的术语是静态的)那么不要使用 mootools Class- 使用常规的 js 对象:(当然你可以在里面使用 mootools)

var Database = {

            init:function(db){
                this.db = db;
                this.prepareDatabase();
                this.createTable();
            },


            prepareDatabase:function(){

                if(!this.donePrepare){
                     this.donePrepare = true;
                     var dbSize = 5 * 1024 * 1024; // 5MB
                     this.db = openDatabase("Todo", "1.0", "Todo manager", dbSize);
                }
            },

            createTable:function(){

                if(!this.doneCreate){
                    this.doneCreate = true;
                    this.db.transaction(function(tx){
                        tx.executeSql("CREATE TABLE IF NOT EXISTS todo(ID INTEGER PRIMARY KEY ASC, title TEXT, description TEXT, isDone INTEGER, date DATETIME)", [])
                    });
                }else{
                    console.log("functie createTable is al aangeroepen");
                }
            }

};

然后你可以像这样从任何地方调用它:

Database.init();
于 2013-05-06T22:58:14.087 回答