Как создать несколько элементов / записей или сохранить массив элементов / записей одновременно в файле клиентского скрипта - PullRequest
1 голос
/ 22 марта 2019

Я хочу создать несколько записей одновременно, используя клиентский скрипт. Вот что я делаю:

var ceateDatasource = app.datasources.Reservation.modes.create;
var newItem = ceateDatasource.item;

newItem.User = user; //'eric'
newItem.Description = description; //'000'
newItem.Location_Lab_fk = lab.value.Id; //'T'
newItem.Area_fk = area.value.Id; //'L'
newItem.Equipment_fk = equipment.value.Id; //'S'

for(var i = 0 ; i < 3; i ++) {
  newItem.Start_Date = startDate;
  newItem.Start_Hours = '03';
  newItem.Start_Minutes = '00';

  newItem.End_Date = startDate;
  newItem.End_Hours = '23';
  newItem.End_Minutes = '30';

  // Create the new item
  ceateDatasource.createItem();
}

Но результат, который я получаю, таков: enter image description here

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

Спасибо.



Обновление (2019-3-27):

Мне удалось заставить его работать, поместив все в блок for loop . Однако у меня есть еще один вопрос.

Существует ли какой-либо метод, подобный приведенному ниже образцу кода?

var recordData = [Data1, Data2, Data3] 
var ceateDatasource;
var newItem = new Array(recordData.length) ;

for(var i = 0 ; i < recordData.length; i ++) {
  ceateDatasource = app.datasources.Reservation.modes.create;
  newItem[i] = ceateDatasource.item;

  newItem[i].User            = recordData[i].user;
  newItem[i].Description     = recordData[i].Description;
  newItem[i].Location_Lab_fk = recordData[i].Location_Lab_fk;
  newItem[i].Area_fk         = recordData[i].Area_fk;
  newItem[i].Equipment_fk    = recordData[i].Equipment_fk;

  newItem[i].Start_Date    = recordData[i].Start_Date;
  newItem[i].Start_Hours   = recordData[i].Start_Hours;
  newItem[i].Start_Minutes = recordData[i].Start_Minutes;

  newItem[i].End_Date    = recordData[i].End_Date;
  newItem[i].End_Hours   = recordData[i].End_Hours;
  newItem[i].End_Minutes = recordData[i].End_Minutes;
}

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

Во-первых, он подготавливает массив 'newItem' и вызывает 'ceateDatasource.createItem ()' только один раз, чтобы сохранить все новые записи (или элементы). Я пытаюсь использовать этот метод, но он сохраняет только последнюю запись 'newItem [3]'.

Мне нужно написать функцию обратного вызова в 'ceateDatasource.createItem ()', но Google App Maker всегда показывает предупреждение "Не создавать функции в цикле". Итак, есть ли методы для вызова createItem () один раз, чтобы сохранить несколько записей? Или есть некоторые функции, такие как «array.push», которые можно использовать?

Спасибо.

1 Ответ

1 голос
/ 22 марта 2019

Согласно официальной документации AppMaker :

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

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

for(var i = 0 ; i < 3; i ++) {

  var ceateDatasource = app.datasources.Reservation.modes.create;
  var newItem = ceateDatasource.item;

  newItem.User = user; //'eric'
  newItem.Description = description; //'000'
  newItem.Location_Lab_fk = lab.value.Id; //'T'
  newItem.Area_fk = area.value.Id; //'L'
  newItem.Equipment_fk = equipment.value.Id; //'S'

  newItem.Start_Date = startDate;
  newItem.Start_Hours = '03';
  newItem.Start_Minutes = '00';

  newItem.End_Date = startDate;
  newItem.End_Hours = '23';
  newItem.End_Minutes = '30';

  // Create the new item
  ceateDatasource.createItem();
}

Если вы хотите сохранить несколько записей одновременно с помощью клиентского скрипта, то вам нужен Ручной режим сохранения . Поэтому все, что вам нужно сделать, это перейти к источнику данных вашей модели и установить флажок «Режим ручного сохранения».

enter image description here

Затем используйте тот же код, что и выше. Единственное отличие состоит в том, что для сохранения изменений на сервере вам необходимо явно сохранить изменения. Так что все, что вам нужно сделать, это добавить следующее после for loop block:

app.datasources.Reservation.saveChanges(function(){
     //TODO: Callback handler
});
...