2014-09-12 2 views
1

Я новичок в скрипте google. У меня есть источник данных, который мне нужно отображать в таблице и позволять пользователю выбирать строку и выбирать открытую кнопку. обработчик события кнопки открытия должен иметь возможность узнать номер строки, чтобы я мог отправить запрос с выбранным именем пользователя.выберите строку из скрытого в скрипте Google

Я думал о добавлении флажка и события click, просто прочитайте имя флажка с номером строки.

Пожалуйста, дайте мне знать, как это сделать. спасибо

var panel = app.createVerticalPanel(); 
    var scroll = app.createScrollPanel().setPixelSize(500, 300); 
    scroll.add(panel); 

    var flexTable = app.createFlexTable().setStyleAttribute('border', '1px solid black') 
     .setStyleAttribute('borderCollapse','collapse') 
     .setBorderWidth(1); 
    flexTable.setText(0, 1, 'Application Name') 
    flexTable.setRowStyleAttribute(0,'color', 'blue') 
    flexTable.setText(0, 2, 'Owner') 
    flexTable.setText(0, 3, 'Date') 

    var handler = app.createServerClickHandler('clickTable'); 
    var counter = 1; 
    for (var i in queryResult.records) { 
     var chkBox = app.createCheckBox().setName('chk' + counter).setId('chk'); 

     var owner = queryResult.records[i]["Owner"]["Name"]; 
     var AppName = queryResult.records[i]["Name"]; 
     var ModifiedDate = queryResult.records[i]["LastModifiedDate"] 
     var UniqId = queryResult.records[i]["Apttus_XApps__UniqueId__c"] 
     flexTable.setWidget(counter, 0 , chkBox) 
     flexTable.setText(counter, 1, AppName.toString()); 
     flexTable.setText(counter, 2, owner.toString()); 
     flexTable.setText(counter, 3, ModifiedDate.toString()); 
     counter ++; 
    } 

    panel.add(app.createButton('Open', handler)); 
    panel.add(flexTable); 
    app.add(scroll); 
+0

ваш код кажется правильным ... в чем проблема? –

+0

Единственная особенность, которую я бы лично добавил, - это не нажимать кнопку до тех пор, пока не будет выбран флажок ... или, если только один из них можно выбрать, используйте radioButtons, потому что это «эксклюзивные». Как вы думаете? –

+0

Серж это правильно, вам нужно использовать элементы управления RadioButton, чтобы пользователь мог выбирать только одну запись за раз. Кроме того, вам нужно применить тот же счетчик к идентификатору элемента управления - и лично я бы разделил имя/идентификатор, используя знак подчеркивания, чтобы вы могли легко разбить индекс из класса в вашем обработчике: var chkBox = app.createCheckBox () .setName ('chk_' + counter) .setId ('chk_' + counter) Обратите внимание, что у RadioButton есть другое соглашение об именах для сгруппированных элементов управления, поэтому проверьте документацию – Tim

ответ

0

Вы создали только обработчик сервера, но к нему не подключены элементы обратного вызова. Пожалуйста, взгляните на это page

Итак, ваш код будет таким.

var handler = app.createServerClickHandler('clickTable'); 
handler.addCallbackElement(panel) 

Далее: на серверной функции clickTable

function clickTable(e) 
{ 
for (var i in e.parameter) { 
    Logger.log('parameter ' + i+1 + ' is ' + e.parameter[i]); 
    } 

// пробуем фиксируя все значения, которые передаются и использовать его соответствующим образом, }

0

Вот пример реализации I предложенный в комментариях выше, используя radioButtons.

Пользователь может подать только если был выбран один вариант

test online here

код:

function doGet(){ 
    var app = UiApp.createApplication(); 
    var panel = app.createVerticalPanel().setStyleAttributes({'padding':'15px'}); 
    var handler = app.createServerClickHandler('clickTable').addCallbackElement(panel); 
    var btn = app.createButton('Open', handler).setEnabled(false); 
    panel.add(btn); 
    var scroll = app.createScrollPanel().setPixelSize(500, 400); 
    scroll.add(panel); 
    var flexTable = app.createFlexTable().setStyleAttribute('border', '1px solid black') 
    .setStyleAttributes({'borderCollapse':'collapse'}) 
    .setBorderWidth(1).setCellPadding(2); 
    flexTable.setText(0, 1, 'Application Name') 
    flexTable.setRowStyleAttribute(0,'color', 'blue') 
    flexTable.setText(0, 2, 'Owner') 
    flexTable.setText(0, 3, 'Date') 
    var radioValue = app.createTextBox().setName('radioValue').setVisible(false);// set it to visible if you want to see what happens in tests 
    panel.add(radioValue); 
    var counter = 1; 
    for (var i =0;i<10;i++) { 
    var name = counter; 
    var radio = app.createRadioButton('radioBtn','select'); 
    var CliHandler = app.createClientHandler().forTargets(radioValue).setText(name).forTargets(btn).setEnabled(true); 
    radio.addClickHandler(CliHandler); 
// var owner = queryResult.records[i]["Owner"]["Name"]; 
// var AppName = queryResult.records[i]["Name"]; 
// var ModifiedDate = queryResult.records[i]["LastModifiedDate"] 
// var UniqId = queryResult.records[i]["Apttus_XApps__UniqueId__c"] 
// temp var definitions for test 
var owner = 'test'; 
var AppName = 'test'; 
var ModifiedDate = 'test'; 
var UniqId = 'test'; 
// delete in production code 
    flexTable.setWidget(counter, 0 , radio) 
    flexTable.setText(counter, 1, AppName.toString()); 
    flexTable.setText(counter, 2, owner.toString()); 
    flexTable.setText(counter, 3, ModifiedDate.toString()); 
    counter ++; 
    } 

    panel.add(flexTable); 
    app.add(scroll); 
    return app; 
} 

function clickTable(e){ 
    var app = UiApp.getActiveApplication(); 
    app.add(app.createLabel('you have selected item nr '+e.parameter.radioValue)); 
    return app 
} 
+1

интересный подход, не используя Id - догадываюсь, что он выполняет свою работу, но для разработчика OO это потребовало нескольких попыток выяснить! :)) Мне нужно будет запомнить эту технику, но – Tim

+1

Это единственный способ получить одноименное обращение к радиобатам, если они не являются источником обработчика сервера (кнопка в этом примере), их идентификатор не возвращается в callbackElement, и все они имеют одно и то же имя, поэтому это «нет». Это решение с обработчиками клиентов было первоначально предложено Роменом Виалардом, другим ТС на старом форуме Google (теперь уничтоженным) около 3 лет назад ... Это старый, не так ли? :-) –