想要将上一个条目中的某些字段复制到新片段

时间:2017-07-28 01:15:02

标签: google-app-maker

简短版本:我希望在表格中设置“复制”按钮,以便从现有条目中获取值并将其填充到“创建条目”中。页面片段。这样,用户在创建新条目时就不必重新输入所有数据。

长版:

我在表格中添加了两个按钮:编辑和复制。

enter image description here

“编辑”按钮使用以下代码从该特定行中获取信息,并使用片段编辑条目。

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 Fragment显示预先填充的值。

我想确保这些值仅在Page Fragment中,并且在用户按下Submit按钮之前不会被提交。

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

您可以通过将数据传递到页面片段中定义的自定义属性来实现此目的,然后您可以将这些属性放置到相应的字段中。我建议您也查看这篇文章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);

假设您的页面片段中有表单,您可以使用自定义属性绑定每个字段的值。绑定将确保预先填充数据。这可以通过Property Editor对每个字段完成,绑定应如下所示:@ 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;

希望这有帮助!

答案 1 :(得分:1)

我有一种感觉,从复制按钮单击处理程序中删除此行将成为一种技巧(当然,如果您的页面片段绑定到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
});

答案 2 :(得分:1)

感谢Pavel和Wilmar。下面列出了适用于我的解决方案:

//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);