是否可以在 createdatasource 上创建多个草稿项目?

Is it possible to create multiple draft items on createdatasource?

我正在构建一个能够创建议程项目以在会议中讨论的应用程序。议程项目可能包含一个或多个要讨论的附件,因此 AgendaItems 和 AgendaDocs 模型之间存在一对多关系。到目前为止,我有一个看起来像这样的插入表单:

"Select File" 按钮是一个驱动器选择器,我在 onDocumentSelect 事件中的代码如下:

var docs = result.docs; 
var createDataSource = app.datasources.AgendaDocs.modes.create;
for(var i=0; i<docs.length-1; i++){
  var uniqueDraft = createDataSource.item;
  createDataSource.items.push(uniqueDraft);
}
for(var i=0; i<createDataSource.items.length-1; i++){  
  var draft = createDataSource.item;
  createDataSource.items[i].DocTitle = docs[i].name;
  createDataSource.items[i].DocURL = docs[i].url;
  createDataSource.items[i].DriveID = docs[i].id;
}
console.log(createDataSource.items);

代码应该填写 "Select File" 按钮下方的列表小部件,但如您所见,这三个项目是相同的。列表小部件的数据源是"AgendaDocs.modes.create",插入表单的数据源是"AgendaItems.modes.create"。

从 appmaker 读取 official documentation,让我觉得这是可能的,因为 "CreateDataSource" 的属性包括“items”。我需要这里专家的帮助。这可能吗?我是不是使用了错误的方法?

首先,您似乎正试图在一次调用中从不同的模型和它们之间的关系创建记录……此时 App Maker 并不聪明,无法消化如此复杂的一餐。您很可能需要将流程分成多个步骤:

  1. 创建(坚持)议程项目
  2. 创建 AgendaDocs 记录以及与 AgendaItem 的关系

Travel Approval模板应用程序中实现了类似的流程,但它与您的不完全相同,因为它不会批量创建关联。

回到最初的问题。是的,可以有多个 草稿 ,但不能使用创建数据源。您正在寻找 Manual Save Mode。在 完美世界 的某个地方,您的代码看起来类似于:

// AgendaItems in Manual Save mode
var agendaDs = app.datasources.AgendaItems;

// this line will create item on client and automatically push it
// to ds.items and set ds.item to it.
agendaDs.createItem();
var agendaDraft = agendaDs.item;

// Field values can be populated from UI via bindings...
agendaDraft.Type = 'X';
agendaDraft.Description = 'Y';


// onDocumentSelect Drive Picker's event handler
var docsDs = agendaDs.relations.AgendaDocs;

result.docs.forEach(function(doc) {
  // this line will create item on client and automatically push it
  // to ds.items and set ds.item to it...however it will throw an exception
  // with this message:
  // Cannot save a foreign key association for the 'AgendaItem'
  // relation because the target record has not been persisted
  // to the server. To fix this, call saveChanges()
  // on the data source for that record's model: AgendaItem
  docsDs.createItem();
  var docDraft = docsDs.item;

  docDraft.DocTitle = doc.name;
  docDraft.DocURL = doc.url;
  docDraft.DriveID = doc.id;
});


// submit button click
agendaDraft.saveChanges();