PhoneGap и Javascript ООП - PullRequest
       1

PhoneGap и Javascript ООП

1 голос
/ 26 сентября 2011

Я начинаю с phonegap, а также пытаюсь применить с ним JavaScript OOP.Но проблема в вызовах методов и прочем.представьте себе это:У меня есть основной контроллер в JavaScript, этот файл пытается контролировать большую часть рабочего процесса между сетевыми вызовами, базы данных и представления изменений.Это мой main.js.

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 не поддерживается с помощью телефонной пропасти, но я в это не верю.

Можете ли вы помочь?

Заранее спасибо,Elkas

1 Ответ

2 голосов
/ 26 сентября 2011

Проблема в том, что когда вы говорите 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);

Опять же, то, что вы говорите, это "связать checkLogin с this.login и вернуть его мне как ссылку на метод, а не просто как отдельную функцию".

(По совпадениюЯ как бы изобрел Function.prototype.bind. Я описал это в старой статье под названием «Объектно-ориентированное прослушивание событий через частичное приложение в Javascript», это была одна из первых утилит, включенных в Prototype, и теперь она стандартизирована в ECMAScript.5. Для более подробного объяснения, вы могли бы где-нибудь выкопать эту статью.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...