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

Want To Copy Certain Fields From Previous Entry To New Fragment

简短版本: 我希望我的复制按钮位于 table 中,以便能够从现有条目中获取值并将其填充到 "Create Entry" 页面片段。这样用户在进行新输入时就不必重新输入所有数据。


长版:

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

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

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)中。

通过这种方式,用户可以单击 "Copy",SystemOrders_Add 片段会出现,其中包含预填充的值。

我想确保这些值只存在于页面片段中,并且在用户按下提交按钮之前不会被提交。

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

感谢您的帮助!

实现此目的的一种方法是将数据传递给页面片段中定义的自定义属性,然后您可以将这些属性放置到相应的字段中。我建议你也看看这篇文章 https://developers.google.com/appmaker/ui/viewfragments#use_custom_properties_to_customize_page_fragments

首先,您需要在页面片段中创建自定义属性。然后在您的复制按钮 onClick 事件中,您可以使用类似这样的方法将行数据从 table 保存到自定义属性:

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

您可以在项目创建后(可能是 onDetach)将属性设置回 null,如下所示: app.pageFragments.SystemOrders_Edit.properties.ProjectName = null;

希望对您有所帮助!

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

感谢 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);