2017-01-23 7 views
1

Я пытаюсь определить источник данных виджета в результате запроса, но я не уверен, что это возможно.Query as Widget Datasource

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

function queryValue(source, model, key){ 
    console.log("source " + source); 
    app.datasources[model].query.filters.id._equals = source; 
    app.datasources[model].load(function() { 
    console.log(app.datasources.users.items[0][key]); 
    return app.datasources.users.items[0][key]; 
    }); 
    app.datasources[model].query.clearFilters(); 
} 

Назвать это как:

queryValue(@datasource.item.[the_id], "[the_SQLView_Datasouce]", "[the_field_i_want]"); 

В этом случае виджет является таблица, поэтому fucntion повторит количество элементов в talbe

Проблема в том, что либо я получаю тот же результат, что и в обычное время, так как количество предметов или первое не работает!

И вторая проблема заключается в том, что результат не превышает запись отображаемого текста виджетов. enter image description here

Это очень простая функция, и я нашел некоторые обходные пути, но не с функцией источника данных, и они работают слишком медленно, без каких-либо ограничений? Возможно ли это сделать с источником данных?

+0

На скриншоте похоже, что вы пытаетесь отобразить идентификатор отношения. Если у вас есть две модели (таблицы), такие как Employee and Manager или у вас есть модель Employee (таблица) с самоначислением, вы можете просто добавить предварительную выборку для своего источника данных. В этом случае вы сможете связать идентификатор менеджера следующим образом: @ datasource.item.Manager.Id. Документы: https://developers.google.com/appmaker/models/datasources#prefetch –

+0

Поскольку это представление SQL, у него нет отношения, поэтому мне нужно выполнить запрос вручную =) –

+0

В этом случае, если таблица только view-only, я бы предложил использовать вычисляемый источник данных. Это уменьшит количество вызовов на сервер и базу данных, поэтому вы улучшите общую производительность страницы и избавитесь от ярлыков ярлыков. При текущей реализации для таблицы с N-строками приложение сделает как минимум (N + 1 вызов на сервер) + (N + 1 вызовы в базу данных). С вычисленным источником данных вы уменьшите его до 1 + 1 = 2 вызова. –

ответ

2

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

Так вместо того, чтобы ваш код вместо этого должен быть скрипт на сервере, так и должно быть что-то вроде:

function queryValue(source, model, key){ 
    console.log("source " + source); 
    var query = app.models.newQuery(); 
    query.filters.id._equals = source; 
    var results = query.run; 
    return results[0].key; 
} 

(Письменное из памяти, так что простите ошибки.)

+0

Еще раз спасибо Девин! После некоторых небольших твиков решение работает! –

2

По предложению Девина:

Фронтальный

/***************************************************************************** 
Front-end function that calls the querying function @queryValue(source, model, key) in controller_TransformId 
@source => the field ID to transform to label 
@model => the model name to be queried 
@key => the label to be acquired with the query 
@wwidget => the widget making the request 
This function works as a model to manage the transactions between the 
controller at the backend and the view. 
******************************************************************************/ 
function buildTransformID(source, model, key, widget){ 
    google.script.run.withSuccessHandler(
    function successHandler(expectedValue){ 
     widget.text = expectedValue;}) 
    .withFailureHandler(
    function failureHandler(){ 
     widget.text = "undefined";}) 
    .queryValue(source, model, key); 
} 

Back-конец

/***************************************************************************** 
Back-end function that queries the database 
@source => the field ID to transform to label 
@model => the model name to be queried 
@key => the label to be acquired with the query  
This function works works as a controller to query the database from the backend ******************************************************************************/ 
function queryValue(source, model, key){ 
    var query = app.models[model].newQuery(); 
    query.filters.id._equals = source; 
    var results = query.run(); 
    console.log("CONTROLLER return :" + results[0][key]); 
    return results[0][key]; 
} 

Обязательно ли передавать значение widget.text? обратный вызов successHandler является асинхронным, поэтому регулярные возвраты просто дадут мне нули

+0

Спасибо за предоставление окончательного рабочего решения! –