Сочетание нокаута с sammyjs/pathjs и jquery mobile

Я пытаюсь объединить некоторые из библиотек JS для создания мобильного сайта SPA. Я работаю с knockoutJS, который не использует движок маршрутизации, поэтому я беру его у SammyJS или PathJS (пока не решил). И я хотел бы использовать jQuery Mobile, чтобы получить от него элементы управления и мобильный дизайн.

Дело в том, что всякий раз, когда я включаю js-файл jquery mobile в свою страницу, механизм маршрутизации перестает работать. На самом деле это работает, но window.location.hash меняйся не только мной, но и самим jquery mobile.

Итак, вот как выглядит код: в HTML-файле я получил div, который я связал с шаблоном

(function ($) {
infuser.defaults.templateUrl = "templates";
console.log('just before pageinit');
$(document).bind('pagecreate', function () {
    // disable autoInit so we can navigate to bookmarked hash url
    $.mobile.autoInitializePage = false;

    // let PathJS handle navigation
    $.mobile.ajaxEnabled = false;
    $.mobile.hashListeningEnabled = false;
    $.mobile.pushStateEnabled = false;
});

$(document).bind('pagebeforechange', function (e, data) {
    var to = data.toPage;
    if (typeof to === 'string') {
       /* var u = $.mobile.path.parseUrl(to);
        to = u.hash || '#' + u.pathname;
        // manually set hash so PathJS will be triggered
        location.hash = to;
        // prevent JQM from handling navigation*/
        e.preventDefault();
    }

});
$(document).bind('pagechange', function (e, data) {
});

var Model = function () {
    this.items = ko.observable(null);
    this.chosenItemData = ko.observable();
    this.state = ko.observable('items');

    this.goToItemDetails = function (item) {
        location.hash = '/details/' + item.id;
    };
};
window.currentModel = new Model();
ko.applyBindings(window.currentModel);

Path.map('#home').to(function () {
    currentModel.state(window.templates.items);
    currentModel.items(window.dummyData);
});
Path.map('#home/details/:id').to(function () {
    var self = this;
    $(currentModel.items()).each(function (index, item) {
        if (item.id.toString() == self.params['id']) {
            currentModel.chosenItemData(item);
            currentModel.state(window.templates.itemDetail);
        }
    });
});

Path.root('#home');

$(function () {
    Path.listen();
})
})(jQuery);

Теперь вы можете видеть, что $.mobile.hashListeningEnabled = false; имеет значение false, поэтому мобильный jquery не должен ни слушать, ни реагировать на изменения хеша.

Но! Допустим, я перехожу из localhost/sammy/#home в localhost/sammy/#home/detail/1, происходит изменение хеша и сразу же меняется на localhost/sammy/home/detail/1, по какой-то причине сам хеш опускается, а маршрут не выполняется.

Мне жаль, если я не объяснил себя лучше. Я работаю над тем, чтобы опубликовать его на сервере, чтобы каждый мог его увидеть, но, к сожалению, это требует времени.

Между тем, если кто-нибудь знает, что я могу сделать, чтобы это исправить, это будет здорово!

1 ответ

Как видно (и это написано на веб-сайте jQuery Mobile, событие initmobile запускается, когда к нему присоединяется скрипт для jquery mobile. Чтобы иметь возможность прикрепить событие, перед сценарием jQuery Mobile должны быть включены следующие строки.

<script type="text/javascript">
$(document).on('mobileinit', function () {
    $.mobile.ajaxEnabled = false;
    $.mobile.hashListeningEnabled = false;
    $.mobile.pushStateEnabled = false;
    $.mobile.linkBindingEnabled = false;
});

тогда событие onchangehash в jquery mobile будет отключено.

Другие вопросы по тегам