【问题标题】:I can't access another method in javascript oop model我无法在 javascript oop 模型中访问其他方法
【发布时间】:2016-06-18 22:50:06
【问题描述】:

我想在我的数据库中更新或插入数据。 如果用户存在,则更新数据。如果不存在插入数据。

那个函数是Database.getUser()

if (results.rows.length > 0) {
    this.updateData(results.rows[0].id, lastseen);
} else {
    this.saveData(username, lastseen);
}

此代码不起作用。 我收到这样的错误。

未捕获的类型错误:this.saveData 不是函数

未捕获的类型错误:this.updateData 不是函数

如何在我的 Database.getUser() 方法中访问另一个方法?

var Database = function() {
   var mydb = false;
}
Database.prototype.initDB = function() {
   try {
       if (!window.openDatabase) {
           console.log('not supported');
       } else {
           var shortName = 'tbl_xyz';
           var version = '1.0';
           var displayName = 'X Y Z';
           var maxSize = 2 * 1024 * 1024;
           this.mydb = openDatabase(shortName, version, displayName, maxSize);
       }
       console.log('Init DB');
   } catch (e) {
       console.log(e);
   }
}
Database.prototype.createTable = function() {
   try {
       this.mydb.transaction(function(transaction) {
           transaction.executeSql("CREATE TABLE IF NOT EXISTS friends (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, username VARCHAR(50), lastseen TIMESTAMP);", [], this.nullDataHandler, this.errorHandler);
       });
       console.log('Create Table');
   } catch (e) {
       console.log(e);
   }
}
Database.prototype.errorHandler = function(transaction, error) {
   alert("Error processing SQL: " + error);
   return true;
}
Database.prototype.nullDataHandler = function(transaction, results) {}
Database.prototype.saveData = function(username, lastseen) {
   try {
       this.mydb.transaction(function(transaction) {
           transaction.executeSql("INSERT INTO friends (username, lastseen) VALUES (?,?)", [username, lastseen], this.nullDataHandler, this.errorHandler);
       });
       console.log('Save Data');
   } catch (e) {
       alert("Error processing SQL: " + e.message);
       return;
   }
}
Database.prototype.updateData = function(id, lastseen) {
   try {
       this.mydb.transaction(function(transaction) {
           transaction.executeSql("UPDATE friends SET lastseen = ? WHERE id = ?", [lastseen, id], this.nullDataHandler, this.errorHandler);
       });
       console.log('Update Data');
   } catch (e) {
       alert("Error processing SQL: " + e.message);
       return;
   }
}
Database.prototype.getUser = function(username, lastseen) {
   try {
       this.mydb.transaction(function(transaction) {
           transaction.executeSql("SELECT * FROM friends WHERE username = ?", [username], function(transaction, results) {
               if (results.rows.length > 0) {
                   this.updateData(results.rows[0].id, lastseen);
               } else {
                   this.saveData(username, lastseen);
               }
           });
       });
   } catch (e) {
       alert(e.message);
   }
}
Database.prototype.loadData = function() {
   try {
       this.mydb.transaction(function(transaction) {
           transaction.executeSql("SELECT * FROM friends ORDER BY lastseen DESC", [], function(transaction, results) {
               console.log('load OK');
               console.log(results);
               for (var i in results.rows) {
                   var row = results.rows.item(i);
                   console.log('username : ' + row.username + " | lastseen : " + row.lastseen);
               }
           });
           console.log('load Data');
       });
   } catch (e) {
       alert(e.message);
   }
}

编辑

我这样改变,它的工作。 是这样吗?

Database.prototype.getUser = function(username, lastseen) {
    try {
        var my_this = this;
        this.mydb.transaction(
            function(transaction) {
                transaction.executeSql("SELECT * FROM friends WHERE username = ?", [username], function(transaction, results) {
                    if (results.rows.length > 0){
                        my_this.updateData(results.rows[0].id, lastseen);
                    }else{
                        my_this.saveData(username, lastseen);
                    }
                });
            });
    } catch(e) {
        alert(e.message);
    }
}

【问题讨论】:

标签: javascript oop methods


【解决方案1】:

你试图在函数内部使用this

function(transaction, results) {
    if (results.rows.length > 0) {
        my_this.updateData(results.rows[0].id, lastseen);
    } else {
        my_this.saveData(username, lastseen);
    }
}

但该函数不是Database 的成员。在函数范围内this 与定义函数的对象有关。我认为对象是window。您在修改后的版本中使用的方法是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    相关资源
    最近更新 更多