2011-09-26 41 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特性之一,所以我不會責怪你爲此而掙扎。 :-) –