javascript primefaces [duplicate]

Другое решение состоит в том, чтобы выполнить код через последовательный исполнитель nsynjs .

Если базовая функция многозначна

nsynjs будет последовательно оценивать все обещания и ставить обещания результат в свойство data:

function synchronousCode() {

    var getURL = function(url) {
        return window.fetch(url).data.text().data;
    };
    
    var url = 'https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js';
    console.log('received bytes:',getURL(url).length);
    
};

nsynjs.run(synchronousCode,{},function(){
    console.log('synchronousCode done');
});

Если базовая функция не обещает

Шаг 1. Wrap с обратным вызовом в оболочку, совместимую с nsynjs (если у нее есть обещанная версия, вы можете пропустить этот тест):

var ajaxGet = function (ctx,url) {
    var res = {};
    var ex;
    $.ajax(url)
    .done(function (data) {
        res.data = data;
    })
    .fail(function(e) {
        ex = e;
    })
    .always(function() {
        ctx.resume(ex);
    });
    return res;
};
ajaxGet.nsynjsHasCallback = true;

Шаг 2. Вставить синхронную логику в функцию:

function process() {
    console.log('got data:', ajaxGet(nsynjsCtx, "data/file1.json").data);
}

Шаг 3. Выполнить функцию синхронно через nnsynjs:

nsynjs.run(process,this,function () {
    console.log("synchronous function finished");
});

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

Дополнительные примеры здесь: https://github.com/amaksr/nsynjs/tree/master/examples

35
задан BalusC 22 December 2014 в 12:10
поделиться

4 ответа

Вы должны понимать, что jQuery работает с деревом HTML DOM на стороне клиента. jQuery не работает непосредственно с компонентами JSF, как вы писали в исходном коде JSF, но jQuery работает непосредственно с деревом HTML DOM, которое создается этими компонентами JSF. Вам нужно открыть страницу в webbrowser и rightclick, а затем View Source . Вы увидите, что JSF добавляет идентификатор сгенерированных входных элементов HTML с идентификаторами всех родительских компонентов NamingContainer (таких как <h:form>, <h:dataTable> и т. Д.) С : как разделитель по умолчанию. Так, например,

<h:form id="foo">
    <p:selectManyCheckbox id="bar" />
    ...

закончится сгенерированным HTML как

<form id="foo" name="foo">
    <input type="checkbox" id="foo:bar" name="foo:bar" />
    ...

. Вместо этого вам нужно выбрать элементы точно . Однако : является особым символом в CSS-идентификаторах, представляющих псевдоселектор. Чтобы выбрать элемент с идентификатором : в идентификаторе с помощью селекторов CSS в jQuery, вам нужно либо избежать его с помощью обратного слэша, либо использовать селектор атрибутов [id=...] или просто использовать старый getElementById():

var $element1 = $("#foo\\:bar");
// or
var $element2 = $("[id='foo:bar']");
// or
var $element3 = $(document.getElementById("foo:bar"));

Если вы видите автогенерированную часть j_idXXX в идентификаторе, где XXX представляет инкрементное число, тогда вы должны указать конкретному компоненту фиксированный идентификатор, поскольку инкрементное число является динамическим и может быть изменено в зависимости от того, физическое положение в дереве.


. В качестве альтернативы вы также можете просто использовать имя класса:

<x:someInputComponent styleClass="someClassName" />

, которое заканчивается в HTML как

<input type="..." class="someClassName" />

, чтобы вы могли получить его как

var $elements = $(".someClassName");

Это позволяет лучше абстрагироваться и повторно использовать. Разумеется, эти элементы не уникальны . Только основные элементы макета, такие как заголовок, меню, содержимое и нижний колонтитул, действительно уникальны, но они, как правило, обычно не находятся в NamingContainer.


Как еще одна альтернатива, вы могли бы просто пройти сам элемент HTML DOM в функцию:

<x:someComponent onclick="someFunction(this)" />
function someFunction(element) {
    var $element = $(element);
    // ...
}

См. также:

72
ответ дан Community 25 August 2018 в 00:21
поделиться

Вы также можете использовать jQuery «Attribute Contains Selector» (здесь находится url http://api.jquery.com/attribute-contains-selector/ )

Например, если у вас есть

 <p:spinner id="quantity" value="#{toBuyBean.quantityToAdd}" min="0"/> 

, и вы хотите что-то сделать на его объекте, вы можете выбрать его с помощью

jQuery('input[id*="quantity"]')

, и если вы хотите распечатать его значение, вы можете сделайте это

alert(jQuery('input[id*="quantity"]').val());

. Чтобы узнать реальный тег html элемента, вы всегда можете посмотреть на реальный элемент html (в этом случае счетчик был переведен на вход) с использованием firebug или, например, инструментов разработчика или просмотра источник ...

Daniel.

5
ответ дан Daniel 25 August 2018 в 00:21
поделиться

Если вы используете RichFaces, вы можете проверить rich:jQuery comonent. Он позволяет указать идентификатор стороны сервера для компонента jQuery. Например, у вас есть компонент с указанным идентификатором сервера, тогда вы можете применить любой материал, связанный с jQuery, следующим образом: <rich:jQuery selector="#<server-side-component-id>" query="find('.some-child').removeProp('style')"/>.

Для получения дополнительной информации, пожалуйста, проверьте doumentation .

Надеюсь, что это поможет.

1
ответ дан nndru 25 August 2018 в 00:21
поделиться

Посмотрите, что это поможет вам, когда я выбираю опыт = Да, мой диалог, id которого является dlg3, является popup.and, если значение No, оно не откроется

-3
ответ дан Prafulla Kumar Sahu 25 August 2018 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: