Хотите скопировать определенные поля из предыдущей записи в новый фрагмент

Краткая версия: я хочу, чтобы моя кнопка «Копировать» была в таблице, чтобы иметь возможность извлекать значения из существующей записи и заполнять их во фрагменте страницы «Создать запись». Таким образом, пользователям не нужно повторно вводить все данные при создании новой записи.


Длинная версия:

У меня есть две кнопки, добавляющие строки в мою таблицу: «Редактировать» и «Копировать».

введите здесь описание изображения

Кнопка «Изменить» использует следующий код для получения информации из этой конкретной строки и использует фрагмент для редактирования записи.

widget.datasource.saveChanges();
app.datasources.SystemOrders.selectKey(widget.datasource.item._key);
app.showDialog(app.pageFragments.SystemOrders_Edit);

Кнопка «Копировать» в настоящее время использует следующий код для дублирования записи и ее автоматического создания.

//Allows for copying table/row
var rowDataSource = widget.datasource;
var listDatasource = app.datasources.SystemOrders_HideComplete;
var createDataSource = listDatasource.modes.create;

widget.datasource.saveChanges();

// Enter fields you want to duplicate below
createDataSource.item.ProjectName = rowDataSource.item.ShowName;
createDataSource.item.DeliveryInfo = rowDataSource.item.DeliveryInfo;
createDataSource.item.SOB = rowDataSource.item.SOB;
createDataSource.item.DeliveryDate = rowDataSource.item.DeliveryDate;
createDataSource.item.Company = rowDataSource.item.Company;
createDataSource.item.Location = rowDataSource.item.Location;
 createDataSource.item.AdditionalPeripherals = rowDataSource.item.AdditionalPeripherals;
createDataSource.item.Notes = rowDataSource.item.Notes;
createDataSource.createItem();

Я хотел бы изменить это поведение, чтобы кнопка «Копировать» получала значения из этих конкретных полей, но вместо того, чтобы выполнять createDataSource/createItem(); Я хочу, чтобы он поместил эти значения во фрагмент страницы (например, SystemOrders_Add), который имеет соответствующие поля.

Таким образом, пользователь может нажать «Копировать», и появится фрагмент SystemOrders_Add с предварительно заполненными значениями.

Я хочу убедиться, что эти значения находятся только во фрагменте страницы и не фиксируются, пока пользователь не нажмет кнопку «Отправить».

newSOEmailMessage(widget);
widget.datasource.createItem();
app.closeDialog();

Спасибо за помощь!


person Adam Bergeron    schedule 28.07.2017    source источник


Ответы (3)


один из способов сделать это — передать данные в пользовательские свойства, определенные во фрагменте страницы, а затем вы можете поместить эти свойства в соответствующие поля. Я рекомендую вам также ознакомиться с этой статьей https://developers.google.com/appmaker/ui/viewfragments#use_custom_properties_to_customize_page_fragments

Сначала вам нужно создать пользовательские свойства внутри вашего фрагмента страницы. Затем в событии кнопки «Копировать» onClick вы можете использовать что-то вроде этого, чтобы сохранить данные строки из вашей таблицы в пользовательские свойства:

var rowDataSource = widget.datasource.item._key;
app.datasources.SystemOrders.selectKey(rowDataSource);

var projectName = app.datasources.SystemOrders.item.project_name;
var deliveryInfo = app.datasources.SystemOrders.item.delivery_info;
//...
app.pageFragments.SystemOrders_Edit.properties.ProjectName = projectName;
app.pageFragments.SystemOrders_Edit.properties.DeliveryInfo = deliveryInfo;
//...
app.showDialog(app.pageFragments.SystemOrders_Edit);

Предполагая, что у вас есть форма внутри вашего фрагмента страницы, вы можете связать значение каждого поля с настраиваемыми свойствами. Привязка гарантирует, что данные предварительно заполнены. Это можно сделать для каждого поля с помощью редактора свойств, и привязка должна выглядеть так: @properties.ProjectName

Внутри события onClick кнопки «Отправить» вы можете использовать что-то подобное, чтобы создать новый элемент в источнике данных, используя значения, доступные в каждом поле.

var projectName = widget.root.descendants.Field1.value;
var deliveryInfo = widget.root.descendants.Field2.value;
//...

var myDatasource = app.datasources.SystemOrders_HideComplete;
var myCreateDatasource = myDatasource.modes.create;
var draft = myDatasource.modes.create.item;

   draft.project_name = projectName;
   draft.delivery_info = deliveryInfo;
   //...

   // Create the new item
   myCreateDatasource.createItem();

app.closeDialog();

Вы можете вернуть свойствам значение null после создания элемента (возможно, onDetach) следующим образом: app.pageFragments.SystemOrders_Edit.properties.ProjectName = null;

Надеюсь это поможет!

person Wilmar    schedule 28.07.2017

У меня есть ощущение, что удаление этой строки из обработчика нажатия кнопки «Копировать» сделает трюк (конечно, если ваш фрагмент страницы привязан к ds.modes.create.item):

createDataSource.createItem();

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

// Copy Button click handler
var source = widget.datasource.item;
var listDatasource = app.datasources.SystemOrders_HideComplete;

// This line will add new item to the list datasource
// without saving it to database.
listDatasource.createItem();
var target = listDatasource.item;

// Enter fields you want to duplicate below
target.Field1 = source.Field1;
target.Field2 = source.Field1;
...

// Show fragment (assuming it is bound to listDatasource.item)
app.showDialog(app.pageFragments.EditItemFragment);


// -----------
// Page Fragment's Submit Button click handler
...
listDatasource.saveChanges(function() {
  // TODO: handle successful save
});
person Pavel Shkleinik    schedule 28.07.2017
comment
Пробовал вариант, который вы указали выше, но он, похоже, не работает. Я думаю, это потому, что источником данных для моего фрагмента был SystemOrders_HideComplete (создать). Во всяком случае, удаление createDataSource.createItem(); вариант из предыдущего текста сработал! Спасибо за помощь. - person Adam Bergeron; 29.07.2017

Спасибо Павлу и Вильмару. Решение, которое сработало для меня, указано ниже:

//Allows for copying table/row
var rowDataSource = widget.datasource;
var listDatasource = app.datasources.SystemOrders_HideComplete;
var createDataSource = listDatasource.modes.create;

widget.datasource.saveChanges();

// Enter fields you want to duplicate below
createDataSource.item.ShowName = rowDataSource.item.ShowName;
createDataSource.item.DeliveryInfo = rowDataSource.item.DeliveryInfo;
createDataSource.item.SOB = rowDataSource.item.SOB;
createDataSource.item.Notes = rowDataSource.item.Notes;

app.datasources.SystemOrders.selectKey(widget.datasource.item._key);

app.showDialog(app.pageFragments.SystemOrders_Add);
person Adam Bergeron    schedule 28.07.2017