2013-08-18 2 views
5

Я создал приложение с SammyJs. В настоящее время он отлично работает в браузере. Однако, когда я упаковываю его на Android с помощью PhoneGap, маршруты больше не работают.Маршруты Sammyjs не работают с Phonegap

Я нашел this SO question. Однако данное решение не работает:

(function($) { 

    var app = $.sammy('[role=main]', function() { 
     this.disable_push_state = true; 
     ... 
    }); 
} 

Неужели кто-нибудь когда-либо испытывал ту же проблему?

EDIT

Я также использую JQuery мобильный телефон с помощью следующего сценария, чтобы отключить его маршрутизацию:

<script type="text/javascript"> 
     // DISABLE JQM ROUTER 
     $(document).bind("mobileinit", function() { 
     $.mobile.ajaxEnabled = false; 
     $.mobile.linkBindingEnabled = false; 
     $.mobile.hashListeningEnabled = false; 
     $.mobile.pushStateEnabled = false; 
     $.mobile.changePage.defaults.changeHash = false; 
     }); 
    </script> 

Я создал gist с моим приложением Сэмми JavaScript (включая маршруты).

+0

Не могли бы вы предоставить код, определяющий маршруты? – RoryKoehein

+0

Я обновил свой ответ сущностью. –

+0

Вы меняете URL-адрес с localhost на нужное имя хоста/ip перед загрузкой на свой телефон, верно? 'url = 'http: // localhost: 3000/api.json? school =' + localStorage.school' – RoryKoehein

ответ

1

Я думаю, что проблема с этим вокруг пункта:

this.around(function(callback) { 
    var context = this; 

    url = 'http://localhost:3000/api.json?school=' + localStorage.school 

    this.load(url) 
    .then(function(data) { 
     parsed = JSON.parse(data); 

     //if (parsed.meta != undefined) { 
     // alert(parsed.meta.message); 
     //} 
     context.products = parsed.products; 
     context.places = parsed.places; 
     context.school = parsed.school; 
     context.title = $('[data-role=header] h1'); 
    }) 
    .then(callback); // *** this won't get called if load() rejects promise 
}); 

Как я понимаю, положение вокруг вызывается обратного вызова(), который будет продолжать загрузку маршрут, когда она вызывается.

Я думаю, что существует проблема с вашей цепочкой обещаний. Если load() возвращает отклоненное обещание (что, вероятно, делает, поскольку на вашем телефоне нет localhost: 3000), то ни одна из ваших функций then() не будет загружаться. Таким образом, callback() не вызывается, а приложение «останавливается». Я бы посоветовал (а) добавить туда некоторую обработку ошибок, чтобы вы могли видеть, что это происходит, и определенно (b) выполнить обратный вызов независимо от результата load(). Кроме того - JSON.parse (данные) выдаст ошибку, если данные не являются надлежащей строкой, кодированной JSON, - вы тоже хотите попробовать/поймать.

Я хотел бы попробовать это:

this.load(url) 
.then(function(data) { 
    try { 
    parsed = JSON.parse(data); 
    } catch(e) { 
    console.log('error decoding json!: '+errorMsg); 
    } 

    //if (parsed.meta != undefined) { 
    // alert(parsed.meta.message); 
    //} 
    context.products = parsed.products; 
    context.places = parsed.places; 
    context.school = parsed.school; 
    context.title = $('[data-role=header] h1'); 
},function(errorMsg){ 
    console.log('error loading json!: '+errorMsg); 
}) 
.fin(callback); // *** fin() is meant to execute on both success and error, like a "finally". 

Если ваша реализация обещания не поддерживает плавник(), посмотреть, что она зовет его эквивалент. Это, по существу, сокращение от: .then(callback).otherwise(callback)

Короткий длинный рассказ - вы хотите удостовериться, что обратный вызов, пройденный вокруг, будет выполнен независимо от того, что, или вы не будете продолжать загрузку маршрута, что является вашим неожиданным поведением быть.

Что касается того, что вы не можете видеть консоль, я не уверен, как выглядит ваша среда, но в прошлом у меня был успех с Eclipse и ADT - я прекрасно вижу журналы и ошибки консоли.

+0

Моя проблема решена. Тем не менее, я нахожу JQM очень медленным с помощью PhoneGap, и мне не нравится, что я должен бороться против фреймворка. Я мог бы изменить свои взгляды и оставить Sammy ... –

+1

Это может быть неприменимо к вашему делу, но я часто обнаружил, что «очевидная» отзывчивость его имеет много общего с тайм-аутами зависания/крана. Если он медленно реагирует на краны, проверьте [jqm docs on cordova] (http://view.jquerymobile.com/1.3.2/dist/demos/faq/how-configure-phonegap-cordova.html), если вы находитесь Уже. Попробуйте настроить функцию $ .mobile.buttonMarkup.hoverDelay. Целенаправленно ждет несколько сотен мс, чтобы отличить наведение/кран - если у вас нет парящих элементов, вы можете отключить его, и ваше приложение будет чувствовать себя более отзывчивым. –

+0

лучший ответ, чем предыдущая попытка: http://stackoverflow.com/questions/11024464/speeding-up-page-transitions-in-jquery-mobile-1-1-for-iphone-apps-built-with-pho (убедитесь, что вы соответствуете вашей версии jqm) –