2011-09-26 69 views
1

我从phonegap开始,并尝试将JavaScript OOP与它一起使用。但问题是方法调用和东西。想象一下:
我在JavaScript中有一个主控制器,这个文件试图控制网络调用之间的大部分工作流程,数据库和变更视图。
这是我的main.js。PhoneGap和Javascript OOP

var onlineStatus = false; 
var mainModel; 
var connectTo = "http://192.168.1.65/mobile/service/"; 

document.addEventListener("deviceready", onDeviceReady, false); 
document.addEventListener("online", online, false); 
document.addEventListener("offLine", offline, false); 

function whenOnline() { 
    setOnline(true); 
} 

function whenOffline() { 
    setOnline(false); 
} 

function onDeviceReady() { 
    mainModel = new MainModel(); 
    mainModel.openDatabase(); 
    mainModel.startApplication(); 
} 

和mainModel是这样的:

function MainModel() { 
    this.isOnline = false; 
    this.database = null; 
    this.login = null; 

    this.getDatabase = function() { 
     return this.database; 
    }; 

    this.openDatabase = function() { 
     this.login = new LoginModel(); 
     this.database = window.openDatabase("wayacross", "0.2", "Test DB", 1000000); 
    }; 

    this.startApplication = function() { 
     this.database.transaction(this.login.checkLogin, goLoggin); 
    }; 
} 

和登录模式:

function LoginModel() { 

    this.loginError = function() { 
     navigator.notification.alert('Login Error', // message 
     null, // callback 
     'Login', // title 
     'Done'     // buttonName 
     ); 
     goLogin(); 
    }; 

    this.isLogged = function(tx, results) { 
     //ajax code 
    }; 

    this.checkLogin = function(tx) { 
     alert('checkLogin: Variable TX = '+ tx); 
     tx.executeSql('SELECT * FROM login', [], this.isLogged, this.loginError); 
    }; 

} 

这是我的时刻来控制启动工作流的代码。问题是当我打电话在mainModel.js this.database.transaction(this.login.checkLogin,goLoggin);它不会无所作为。当我将this.login.checkLogin更改为this.login.checkLogin()时,它工作正常,但tx变量未定义。

我可能在这里做错了事,但我不知道为什么。也许JavaScript OOP不支持phonegap,这是我不真正相信的。

你能帮忙吗?

由于提前,
Elkas

回答

2

的问题是,当你说this.login.checkLogin,你得到的功能一个参考,但失去了参考对象this.login要与关联功能。这是JavaScript必须完全理解的基本属性之一,或者在使用Javascript时总是会感到困惑。

这正是Function.prototype.bind的用途。它在旧版浏览器中本地不可用(所以大多数Javascript框架都有自己的实现),但是由于您使用的是PhoneGap,因此您可能将目标锁定为现代移动WebKit浏览器。

Function.prototype.bind所做的是将一个函数和一个对象一起捆绑到一个独立的“方法引用”中。在内部,方法引用仅仅是一个函数,它将调用原始函数作为对象的方法

这里是你将如何使用它:

this.database.transaction(this.login.checkLogin.bind(this.login), goLoggin); 

同样,你在说什么就有什么“绑定checkLoginthis.login才还给我作为一个方法的参考,而不是仅仅作为分离功能”。 (巧合的是,我发明了Function.prototype.bind。我在一篇名为“通过Javascript中的部分应用程序进行面向对象的事件监听”的旧文章中描述了它,它是Prototype中包含的第一批实用程序之一,现在它已成为已经在ECMAScript 5中进行了标准化。有关更详细的解释,您可能可以在某处找到该文章。)

+0

感谢您回复mate =)我会尽力找到它并尝试更好地理解它。 – Elkas

+0

没问题。你已经遇到了一些经典的Javascript特性之一,所以我不会责怪你为此而挣扎。 :-) –