2015-06-10 6 views
0

Я хочу определить функцию JavaScript для каждого экземпляра композитного компонента JSF.Как я могу создать уникальное имя переменной JavaScript из JSF clientId?

Для этого внутри компонента, я пытаюсь что-то вроде:

<h:outputScript> 
function myFunction_#{component.clientId}(day) { 
    //do my instance specific stuff 
} 
</h:outputScript> 

Конкретно я пытаюсь использовать эту функцию в календаре RichFaces, как это:

<rich:calendar id="calendar" ... dayClassFunction="myFunction_#{component.clientId}"> 

Но ClientId не обязательно содержит только символы, которые действительны в именах переменных JavaScript.

Есть ли способ вычислить хеш-память md5 или что-то подобное псевдо-уникальному с clientId (или что-то еще!) Внутри выражения JSF EL?

Мне нужна его конкретная спецификация, потому что возвращаемое значение зависит от значений экземпляра, а атрибут dayClassFunction не принимает функцию, которая принимает сам clientId или что-то подобное в качестве аргумента.

+0

Это было бы относительно просто, если '' 'внутри этой функции был узел DOM, созданный для' '. Не так ли в JSF? –

+0

Действительно! Спасибо, я только что проверил, это не узел DOM, но все-таки специфический для экземпляра объект JS, это очень полезно. – user777

+0

. Вы идете об этом неправильно. Чистый путь задают и отвечают здесь: http://stackoverflow.com/questions/12615556/integrate-javascript-in-jsf-composite-component-the-clean-way Просто повторно используйте одну и ту же функцию и извлеките данные составного компонента там. – BalusC

ответ

2

Я сделал это раньше, как это:

window['#{cc.clientId}'] = { 
    myFunction1 : function() { ... }, 
    myFunction2 : function() { ... } 
}; 

тогда просто позвоните туда, где вам это нужно с

dayClassFunction="window['#{cc.clientId}'].myFunction1()" 

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

Невозможно представить какой-либо символ, который разрешен в идентификаторе клиента, который нарушит javascript.

+0

О, это хорошо! Я не думал о индексах массивов, которые могут быть произвольными строками в JS, благодаря хорошему трюку – user777

1

Предполагая, что разделитель (:), что это проблема, которую Вы можете использовать fn:replace:

function myFunction_#{fn:replace(component.clientId, ':', '_')} 
+0

Спасибо, это должно дать довольно уникальные и действительные строки! – user777

1

При вызове вашей функции, JSF будет назначать this быть экземпляр конкретного JS объект, который JSF использует для реализации клиента боковая сторона. Вы можете получить необходимую вам информацию.