2016-12-22 5 views
0

Я работаю над приложением, использующим Xpages и KendoUI. На одной конкретной странице у меня есть панель инструментов с кнопкой «Добавить запись». Кнопка открывает окно, и пользователь выберет один из части данных и создаст новую запись.Xpages: Получение sessionScope Array в CSJS

Список данных - это имена сотрудников, и я должен их вычислить. Я делаю это в sessionScope [может быть viewScope] массив в beforePageLoad, например, так:

<xp:this.beforePageLoad> 
<![CDATA[#{javascript:viewScope.myArray = []; 
viewScope.myArray.push("1st Val"); 
viewScope.myArray.push("2nd Val"); 
viewScope.myArray.push("3rd Val");}]]> 
</xp:this.beforePageLoad> 

Раскрывающийся необходимы данные в следующем формате:

var data = [ 
       { text: "Black", value: "1" }, 
       { text: "Orange", value: "2" }, 
       { text: "Grey", value: "3" } 
       ]; 

Для жизни меня я не могу получить данные в этот формат. Это похоже на объект javascript для меня.

Как получить массив в viewScope в формате, в котором я нуждаюсь?

var o = {}; 
o = "#{javascript:viewScope.get('myArray');"; 

ответ

1

Когда вы устанавливаете переменную js на стороне клиента, называемую o, это строка, потому что значение находится между «".

Так что просто удалите двойные кавычки, и вы получите его как объект.

o=#{javascript:viewScope.get('myArray')}; 

Но знайте, вы можете получить сообщение об ошибке на стороне клиента JS, если значение viewscope не является действительным клиентом объект стороне JS!

Вы также можете установить переменную o в строку, как это было в вашем примере, и использовать метод eval clientside для оценки строки как объекта.

o=eval("#{javascript:viewScope.get('myArray')}"); 

P.S. В вашем примере отсутствует} в конце вашего SSJS-кода, когда вы устанавливаете переменную «o» .. ;-)

+0

Линия o = # {javascript: viewScope.get ('myArray')}; бросает исключение. Правильно ли синтаксис? Я пытаюсь сделать эту работу, но я не могу ее получить. –

+0

@BryanSchmiedeler Когда (жизненный цикл) ваш 'myArray' заполняется в' viewScope'? Возможно, он не сформирован при первом доступе. Возможно, попробуйте 'o = # {javascript: viewScope.get ('myArray')} || [];', чтобы обеспечить условный отказ от пустого массива. –

+0

Быстрые тесты с использованием вашего первого примера (viewScope.myArray.push («1-й вал»)), но я не использовал JSON Object в качестве элементов массива, так что, вероятно, поэтому он не подходит для вас. xpages-noob ответ будет работать с объектами JSON. –

3

Все объекты массива SSJS, добавленные в любую область, преобразуются в java.util .Vector (how to update a value in array scoped variable?), который не может быть закреплен стандартной функцией toJson. Это может быть обойдена путем создания промежуточного объекта для хранения массива в:

viewScope.myData={myArray:[]}; 
viewScope.myData.myArray.push({ text : 'Mark' , value : '1' }); 
viewScope.myData.myArray.push({ text : 'Bryan' , value : '2' }); 

Кроме того, я сомневаюсь, что ваша строка кода возвращает правильные данные без явного преобразования JSON. Я бы назвал это как:

var myArray = #{javascript:return toJson(viewScope.myData.myArray);};