2011-09-26 6 views
1

나는 phonegap에서 시작하여 JavaScript OOP를 적용하려고합니다. 그러나 문제는 메서드 호출 및 물건입니다.
JavaScript로 메인 컨트롤러를 가지고 있는데,이 파일은 네트워크 호출, 데이터베이스 변경보기 사이에서 대부분의 작업 흐름을 제어하려고합니다.
이것은 내 main.js입니다. PhoneGap and 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를 완전히 이해해야하거나 Javascript로 작업 할 때 항상 혼란 스럽습니다.

정확하게 이것은 Function.prototype.bind을위한 것입니다. 이전 브라우저에서는 기본적으로 사용할 수 없으므로 (대부분의 Javascript 프레임 워크는 자체적으로 구현되어 있음) PhoneGap을 사용하고 있기 때문에 아마도 최신 모바일 WebKit 브라우저를 대상으로하고있을 것입니다.

무엇이 Function.prototype.bind은 함수와 개체를 함께 포함 된 "메서드 참조"에 포함시킵니다. 내부적으로 메서드 참조는 단순히 개체 함수으로 원래 함수 을 호출하는 함수입니다. 분리 된 같은 단지, "this.logincheckLogin을 결합 당신이 무슨 말을하는지, 또 다시

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

및 방법을 참조로 다시 나에게 그것을 제공 : 여기

당신이 그것을 사용하는 것이 방법 기능".

(부수적으로, 저는 Function.prototype.bind을 발명했습니다. "자바 스크립트에서 부분적 응용을 통한 객체 지향 이벤트 청취"라는 구식 기사에서 설명했는데, 프로토 타입에 포함 된 첫 번째 유틸리티 중 하나였습니다. ECMAScript 5에서 표준화되었습니다. 자세한 설명은 어딘가에있을 수 있습니다.)

+0

답장을 보내 주셔서 감사합니다. 나는 그것을 찾고 더 잘 이해하려고 노력할 것입니다. – Elkas

+0

문제 없습니다.당신은 소수의 고전적인 Javascript 특질 중 하나에 부딪 쳤기 때문에 나는 그것으로 고생해서 당신을 비난하지 않습니다. :-) –