Проблемы с рендерингом jQuery Mobile с контентом, добавляемым после инициализации страницы

Я использую jQuery Mobile и Backbone JS для проекта. В основном это работает, используя событие jQuery Mobile'pagebeforeshow', чтобы вызвать правильный просмотр Backbone. В Backbone View для этой конкретной страницы jQuery Mobile она выполняет все необходимые динамические функции. Некоторые вещи, которые делают представления, - это извлечение определенных битов с использованием системы шаблонов Underscore.

Это все замечательно до тех пор, пока я не потяну кусочки формы, используя систему шаблонов. Например, набор динамических переключателей (которые генерируются из коллекции Backbone). Эти радиокнопки я хочу оформить, используя то, что предлагает jQuery Mobile. В настоящий момент jQuery Mobile не принимает эти динамически внедренные переключатели. Я решил эту проблему ранее, когда выполнял ползунки, просто снова вызвав метод "slider()" виджета jQuery Mobile, и, похоже, он их обновил... Это не относится к этим переключателям.

В Backbone View я снова попытался вызвать методы виджета:

$(this.el).find("input[type='radio']").checkboxradio();
$(this.el).find(":jqmData(role='controlgroup')").controlgroup();

Я попробовал их и наоборот, но мне показалось, что мне нужно сделать это таким образом, чтобы стиль группирования работал и т. Д. Но это просто кажется неправильным!... выполнение этого также вызывало ошибки, когда я нажимал на переключатели, говоря: "не удается вызвать методы на checkboxradio до инициализации; попытался вызвать метод" обновить ""?

Кажется, в jQuery Mobile должен быть способ повторно инициализировать страницу или что-то в этом роде?! Я заметил, что в исходном коде есть виджет страницы.

Как jQuery Mobile обрабатывает формы / элементы, внедряемые в DOM после создания страницы? Есть ли чистый способ обработки, как она составляет формы? Должен быть чистый способ вызова форм для рендеринга "способа jQuery Mobile" без использования только тегов атрибутов данных в базовом HTML?

Любая помощь или понимание этой проблемы будет принята с благодарностью... Я очень заинтересован в том, чтобы попытаться заставить Backbone JS и jQuery Mobile хорошо работать вместе.

Большое спасибо, Джеймс

11 ответов

Решение

Обновить

Начиная с jQueryMobile beta2, есть событие, чтобы сделать это. .trigger('create') на элемент, чтобы заставить все внутри него быть окрашены правильно.

Еще один вопрос, который не является дубликатом, но требует ответа, который я выложил более 10 раз:)

[старый ответ]

пытаться .page()

Больше подробностей в моем FAQ: http://jquerymobiledictionary.pl/faq.html

Я не уверен, помогает ли это, но при добавлении динамических элементов я использовал.page() в самом вызове ajax sucess (пример здесь и здесь), но обнаружил, что он не работает должным образом. Я обнаружил, что в вызове ajax лучше обновить элемент (если это элемент формы), чтобы использовать эти документированные методы:

  • Флажки:

    $("input[type='checkbox']").attr("checked",true).checkboxradio("refresh");
    
  • Радио:

    $("input[type='radio']").attr("checked",true).checkboxradio("refresh");
    
  • Выбор:

    var myselect = $("select#foo");
    myselect[0].selectedIndex = 3;
    myselect.selectmenu("refresh");
    
  • Ползунки:

    $("input[type=range]").val(60).slider("refresh");
    
  • Флип-переключатели (они используют слайдер):

    var myswitch = $("select#bar");
    myswitch[0].selectedIndex = 1;
    myswitch .slider("refresh");
    

и для добавления неформального элемента используйте.page()

Обновление всей страницы работало для меня:

$('#pageId').page('destroy').page();

Попробуйте вызвать.trigger("create") для элемента с новым содержимым.

JQuery Mobile теперь поддерживает.trigger("create"); который решит это для вас

$('#pageId').page('destroy').page(); 

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

-Майк

Это сработало для меня, когда я позвонил.trigger('create') в элемент div. Смотрите пример ниже:

В файле.html:

<div id="status-list" data-role="fieldcontain">
    <fieldset data-role="controlgroup">
        <legend>Choose as many snacks as you'd like:</legend>
            <input type="checkbox" name="checkbox-1a" id="checkbox-1a"/>
            <label for="checkbox-1a">Cheetos</label>
    </fieldset>
</div>

в файле.js:

$("#status-list").trigger('create');

Мне нужен был способ динамического обновления страницы JQM после ее инициализации. Я обнаружил, что если я удалил атрибут данных "page" во время события "pagehide", то при следующем отображении страницы JQM она была повторно инициализирована.

$('#testing').live('pagehide', function (e) {
    $.removeData(e.target, 'page');
}); 

Попробуйте использовать метод EnhiftWithin(). Это должен быть метод любого объекта jQuery при использовании jQuery Mobile.

Я немного не по теме. Я хотел, чтобы jqm не мог создавать первый div страницы по умолчанию при инициализации, так как магистраль в любом случае оборачивает элементы в div. Я хотел динамически вставлять страницы в DOM, а затем вызывать jqm для создания его классов и виджетов. Я наконец сделал это так:

 <head>
 <script src="jquery-1.8.3.js"></script>
 <script type='javascript'>
 $(document).on("mobileinit", function () {  
 $.mobile.autoInitializePage = false;       
 }
 </script>
 <script src="jquery.mobile-1.3.0-beta.1.min.js"></script>
 </head>
 <body>
 ....... dynamically add your content ..........

 <script type='javascript'>
 $.mobile.initializePage() 
 </script>
 </body>

и мой конфиг jqm дыры (который вы поставили перед jqm.js)

$(document).on("mobileinit", function () {
  $.mobile.ajaxEnabled = false;
  $.mobile.hashListeningEnabled = false;
  $.mobile.pushStateEnabled = false;
  $.mobile.linkBindingEnabled = false; // delegating all the events to chaplin
  $.mobile.changePage.defaults.changeHash = false;

  $.mobile.defaultDialogTransition = "none";
  $.mobile.defaultPageTransition = "slidedown";
  $.mobile.page.prototype.options.degradeInputs.date = true;
  $.mobile.page.prototype.options.domCache = false;
  $.mobile.autoInitializePage = false;

  $.mobile.ignoreContentEnabled=true;
}); 

Пока что Backbone и JQM работают нормально.

Только для меня .page() работал (без .page('destroy')).

Например:

$('my-control-group-id').page();

Амнон

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