2013-08-18 25 views
5

Tôi đã xây dựng một ứng dụng với SammyJs. Nó hiện hoạt động hoàn hảo trong trình duyệt. Tuy nhiên, khi tôi gói nó cho Android bằng cách sử dụng PhoneGap, các tuyến đường không hoạt động nữa.Các tuyến Sammyjs không hoạt động với Phonegap

Tôi đã tìm thấy this SO question. Tuy nhiên, giải pháp được đưa ra không hoạt động:

(function($) { 

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

Có ai từng gặp vấn đề tương tự không?

EDIT

Tôi cũng đang sử dụng jquery di động với các kịch bản sau đây để vô hiệu hóa định tuyến của nó:

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

Tôi tạo ra một gist với ứng dụng sammy javascript của tôi (bao gồm cả các tuyến đường).

+0

Bạn có thể cung cấp mã nơi bạn xác định tuyến đường của mình không? – RoryKoehein

+0

Tôi đã cập nhật câu trả lời của mình bằng một ý chính. –

+0

Bạn đang thay đổi URL từ localhost sang đúng tên máy chủ/ip trước khi tải lên điện thoại của bạn, phải không? 'url = 'http: // localhost: 3000/api.json? school =' + localStorage.school' – RoryKoehein

Trả lời

1

Tôi nghĩ vấn đề là quy định tại khoản xung quanh này:

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

Theo tôi được biết, mệnh đề xung quanh được gọi với một callback(), mà sẽ tiếp tục tải các tuyến đường khi nó được gọi.

Tôi nghĩ rằng có vấn đề với chuỗi lời hứa của bạn. Nếu load() trả về một lời hứa bị từ chối (có thể là do không có localhost: 3000 trên điện thoại của bạn), thì không phải hàm nào() của bạn sẽ tải. Như vậy, gọi lại() không được gọi và ứng dụng "dừng". Tôi sẽ tư vấn (a) thêm một số lỗi xử lý ở đó, vì vậy bạn có thể xem những gì nó xảy ra, và chắc chắn (b) thực hiện gọi lại không có vấn đề kết quả của tải(). Ngoài ra - JSON.parse (dữ liệu) sẽ ném một lỗi nếu dữ liệu không phải là một chuỗi được mã hóa JSON thích hợp - bạn cũng muốn thử/nắm bắt xung quanh đó.

tôi sẽ cố gắng này:

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

Nếu thực hiện lời hứa của bạn không hỗ trợ vây(), tìm kiếm những gì nó đang kêu gọi tương đương của nó. Về cơ bản nó là viết tắt của: .then(callback).otherwise(callback)

Ngắn câu chuyện - bạn muốn đảm bảo rằng cuộc gọi lại được chuyển đến xung quanh sẽ được thực hiện bất kể ứng dụng nào hoặc ứng dụng của bạn sẽ không tiếp tục tải tuyến đường. được. Đối với quan điểm về việc không thể nhìn thấy giao diện điều khiển, tôi không chắc chắn môi trường của bạn trông như thế nào, nhưng tôi đã thành công với Eclipse và ADT trong quá khứ - tôi có thể thấy các nhật ký và lỗi của giao diện điều khiển tốt.

+0

Sự cố của tôi được giải quyết. Tuy nhiên, tôi thấy JQM cực kỳ chậm chạp với PhoneGap và tôi không thích rằng tôi phải chiến đấu chống lại khung công tác. Tôi có thể thay đổi quan điểm của mình và giữ Sammy ... –

+1

Điều này có thể không áp dụng cho trường hợp của bạn, nhưng tôi thường thấy rằng sự phản hồi "rõ ràng" của nó có rất nhiều việc phải làm với thời gian chờ di chuột/vòi. Nếu nó phản ứng chậm với các vòi nước, hãy kiểm tra [tài liệu jqm trên cordova] (http://view.jquerymobile.com/1.3.2/dist/demos/faq/how-configure-phonegap-cordova.html) nếu bạn ở trên thiên đường đã không. Hãy thử tinh chỉnh hàm $ .mobile.buttonMarkup.hoverDelay của bạn. Đó là mục đích chờ đợi xung quanh cho một vài trăm ms để phân biệt hover/tap - nếu bạn không có các yếu tố hoverable bạn có thể biến nó xuống và có ứng dụng của bạn cảm thấy phản ứng nhanh hơn. –

+0

câu trả lời hay hơn so với lần thử trước của tôi: http://stackoverflow.com/questions/11024464/speeding-up-page-transitions-in-jquery-mobile-1-1-for-iphone-apps-built-with-pho (chắc chắn rằng bạn phù hợp với phiên bản jqm của bạn) –

Các vấn đề liên quan