2016-06-07 3 views
0

У меня есть раскрывающееся меню выбора, в котором событие onChange вызывает вызов Ajax для повторной обработки формы, а затем вызывает функцию javascript init(), которая будет изменять порядок сортируемых div в формы на основе новых данных. Используя отладчик, я обнаружил, что после инициализации() делается дивы прикажут, как и ожидалось, но тогда он будет выполнять:Scriptaculous Sortable не работает должным образом с Ajax и JSF

responder = function(event) { 
     Event.extend(event, element); 
     handler.call(element, event); 
    }; 

в функции функции _createResponder (элемент, именем_события, обработчик) в prototype.js с последующим выполнением

return !scope ? method : function() { 
     return method.apply(scope, arguments || []); 
    }; // Function 

в функции сцепки: функции (/ объекта/сферы,/функции | Строка/метод/... /) в jsf.js, который сбрасывает divs обратно в исходный порядок.

Здесь урезанная фрагмент кода из моего facelet:

<body onload="init()"> 
    <form id="MaintainPreferencesBean"> 
     <t:selectOneMenu id="selectLayout" value="#{maintainPreferencesBean.layoutIndex}"> 
      <f:selectItems value="#{maintainPreferencesBean.layoutNames}" /> 
      <f:ajax listener="#{maintainPreferencesBean.setLayout}" render="@form" onevent="init()" /> 
     </t:selectOneMenu> 
     <div id="sortable"> 
      <div id="demoGroup" class="dataGroup"></div> 
      <div id="offenseGroup" class="dataGroup"></div> 
     </div> 
    </form> 
</body> 

Вот JavaScript:

function init() { 
    changeOrder("sortable", "dataGroup", document.getElementById("MaintainPreferencesBean:selectLayout").selectedIndex); 
    Sortable.create("sortable", { 
    tag : 'div' 
    }); 
} 

function changeOrder(container, className, layoutIndex) { 
    var divs = document.getElementById(container).getElementsByClassName(
     className); 
    for (var i = 0; i < groupNamesArray.length; i++) { 
     var div = document 
      .getElementById(groupNamesArray[desiredOrder[layoutIndex][i]]); 
     var insPt = divs[i]; 
     if (insPt != null && insPt != div) 
     insPt.parentNode.insertBefore(div, insPt); 
    } 
} 

Обратите внимание, что дивы действительно получить правильно заказать на не-Ajax обновления страницы , Также упорядочение работает, когда я использовал valueChangeListener (с обычным обходным путем) вместо Ajax.

ответ

Смежные вопросы