2013-02-13 1 views
2

Это сценарий:Как определить идентификатор поля в среде выполнения CSJS?

У нас есть два поля на Xpage, которые должны быть заполнены из вызова Ajax. Возврат от вызова Ajax является структурой json. В старой школе веб-разработки, мы делаем это с помощью prototype.js:

$H(json).each(function(pair){ 
    try { 
     $(pair.key).value = pair.value 
    } 
    catch(err) { } 
}); 

Успенская здесь является то, что мы имеем fieldIDs равно ключи JSon.

{ 
    "fieldID1":"value1", 
    "fieldID2":"value2" 
} 

XPages CSJS должен иметь поле ID заполнитель, присутствующий в сценарии, чтобы быть в состоянии преобразовать в фактической ID, что поле имеет на XPage:

$("#{id:fieldID1}").value = json.fieldID1; 
$("#{id:fieldID2}").value = json.fieldID2; 

Как определить фактическое поле ID в CSJS время выполнения, используя что-то вроде этого:

$H(json).each(function(pair){ 
    try { 
     $("#{id:"+pair.key+"}").value = pair.value 
    } 
    catch(err) { } 
}); 

Наша текущая форма +10 поля заселяться и в зависимости от обстоятельств поля являются динамическими ally "загружен", и поэтому у нас есть 2 ... n полей в форме, которые будут заполнены ajax/json.

ответ

1

Вот реализация CSJS из GetComponent() методом из SSJS:

/** 
* getComponent 
* 
* CSJS implementation of SSJS's getComponent method 
* 
* @param serverId ComponentId to search for 
* @param fromObj DOM object to start with 
* @author Sven Hasselbach 
* @version 0.3 
*/ 
function getComponent(serverId, fromObj){ 

    var found = false; 
    var obj = fromObj; 
    var id = ""; 

    while(obj){ 
     try{ 
      id = obj.id.split(":").pop(); 
     }catch(e){} 

     if(id == serverId) 
      return obj; 

     ret = findComponent(serverId, obj); 
     if(ret) 
      return ret; 

     obj = obj.parentNode; 
    } 

} 

/** 
* findComponent 
* 
* searches the component tree for a specific 
* server id 
*/ 
function findComponent(searchId, parentNode){ 
    var obj; 
    var id = ""; 

    if(parentNode == null) 
     return; 

    if(parentNode.hasChildNodes() == false) 
     return; 

    for(p in parentNode.childNodes){ 
     obj = parentNode.childNodes[p]; 
     try{ 
      id = obj.id.split(":").pop(); 

      if(id == searchId) 
       return obj; 

      ret = findComponent(searchId, obj); 
      if(ret) 
       return ret; 

     }catch(e){} 
    } 
} 

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

Чтобы получить стартовый узел:

var obj = XSP.getElementById("view:_id1:layoutMain:callbackMiddle:dataViewAllReportsByStatus:1_sumLink"); 

Тогда поиск другого компонента layoutLeft: Fe

var ret = getComponent("layoutLeft", obj); 
alert(ret.id) 
+0

Именно то, что я искал! Бесконечно благодарен! –

4

Хорошо, проблема в том, что XPage не знает идентификатор, когда он подается в браузер. Он рассчитывается с использованием пары .key. Марк Роден написал пару очень хороших статей об этом, где я думаю, что вы можете найти решение, которое вам подходит. См:

http://xomino.com/2012/01/26/using-jquery-selectors-in-xpages/

и

http://xomino.com/2012/02/02/jquery-selector-function-for-xpages-xidinputtext1/

HTH ;-)

/John

+0

Да, вы должны использовать getClientId ("CONTROLNAME") в SSJS, чтобы получить правильный идентификатор. В jQuery вам может понадобиться избежать: в конце идентификатора (dojo.byId работает) – stwissel

+0

Моя проблема заключается в том, чтобы определить идентификатор компонента во время выполнения, а не во время разработки. Является ли это возможным? Примеры от Marky - это то, как определить идентификатор компонента с помощью jQuery, но он все еще находится в режиме разработки, так как Id компонента должен быть известен тем, что Xpages сможет его преобразовать ... –

+0

Первая ссылка, которую я положил в ответ, дает вам некоторые хорошие предпосылки проблемы - и некоторые идеи для решений. Одна из идей - использовать имя класса, которое содержит имя поля.Затем вы можете использовать jQuery во время выполнения, чтобы найти поле, используя вместо этого имя класса. Другой идеей может быть создание «hashmap» во время загрузки с именами полей и «истинными» идентификаторами с использованием синтаксиса # {...}. Тогда вы бы использовали имя поля в качестве ключа, чтобы найти настоящий идентификатор в этой «таблице» ... Не обязательно элегантный, но он мог бы работать ;-)/John –

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