2013-08-18 15 views
5

Zbudowałem aplikację z SammyJs. Obecnie działa idealnie w przeglądarce. Jednak, gdy pakuję go do Androida za pomocą PhoneGap, trasy już nie działają.Trasy Sammyjs nie działa z Phonegapem

Znalazłem this SO question. Jednak podane rozwiązanie nie działa:

(function($) { 

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

Czy ktoś kiedykolwiek doświadczył tego samego problemu?

EDIT

Jestem również przy użyciu jQuery Mobile z poniższego skryptu, aby wyłączyć jego trasy:

<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> 

stworzyłem gist z moim app Sammy javascript (w tym tras).

+0

Czy możesz podać kod, pod którym definiujesz trasy? – RoryKoehein

+0

Uaktualniłem moją odpowiedź z istotą. –

+0

Zmieniasz adres URL z localhost na prawą nazwę hosta/ip przed przesłaniem na telefon, prawda? 'url = 'http: // localhost: 3000/api.json? school =' + localStorage.school' – RoryKoehein

Odpowiedz

1

Myślę, że problem jest z tej klauzuli w okolicy:

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 
}); 

Jak rozumiem, klauzula wokół jest wywoływana z wywołania zwrotnego(), która będzie kontynuować ładowanie trasę kiedy to się nazywa.

Myślę, że jest problem z łańcuchem obietnic. Jeśli load() zwróci odrzuconą obietnicę (która prawdopodobnie ma, ponieważ w telefonie nie ma lokalnego hosta: 3000), żadna z funkcji then() nie zostanie załadowana. W związku z tym wywołanie zwrotne() nie jest wywoływane, a aplikacja "zatrzymuje się". Radziłbym (a) dodać trochę obsługi błędów tam, żebyś mógł zobaczyć, co się dzieje, i zdecydowanie (b) wykonywanie wywołania zwrotnego, niezależnie od wyniku ładowania(). Ponadto - JSON.parse (dane) wygeneruje błąd, jeśli dane nie są prawidłowym łańcuchem zakodowanym przez JSON - chcesz spróbować/złapać to również.

chciałbym spróbować to:

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". 

Jeśli realizacja obietnic nie obsługuje fin(), patrzeć, co to dzwoni jego odpowiednik. Jest to w gruncie rzeczy skrótowe dla: .then(callback).otherwise(callback)

Krótka historia - chcesz się upewnić, że wywołanie zwrotne przekazywane dookoła zostanie wykonane bez względu na to, czy aplikacja nie będzie kontynuować ładowania trasy, co jest przyczyną nieoczekiwanego zachowania użytkownika być.

Jeśli chodzi o brak możliwości zobaczenia konsoli, nie jestem pewien, jak wygląda twoje środowisko, ale w przeszłości miałem powodzenie z Eclipse i ADT - widzę logi konsoli i błędy w porządku.

+0

Mój problem został rozwiązany. Jednak JQM wydaje mi się wyjątkowo powolny dzięki PhoneGap i nie podoba mi się, że muszę walczyć z ramami. Mogę zmienić moje poglądy i zachować Sammy ... –

+1

To może nie mieć zastosowania w twojej sprawie, ale często stwierdzam, że "pozorna" reakcja na nią ma wiele wspólnego z limitami czasu na aktywację/dotknięcie. Jeśli jest powolna reakcja na dotknięcia, sprawdź [jqm docs na cordova] (http://view.jquerymobile.com/1.3.2/dist/demos/faq/how-configure-phonegap-cordova.html) jeśli nie masz już nie. Spróbuj ulepszyć swoją funkcję $ .mobile.buttonMarkup.hoverDelay. Celowo czeka się przez kilkaset ms, aby rozróżnić zawijanie/stukanie - jeśli nie masz elementów hakerskich, możesz wyłączyć to i sprawić, by Twoja aplikacja była bardziej responsywna. –

+0

lepsza odpowiedź niż moja poprzednia próba: http://stackoverflow.com/questions/11024464/speeding-up-page-transitions-in-jquery-mobile-1-1-for-iphone-apps-built-with-pho (upewnij się, że pasujesz do swojej wersji jqm) –