AppMaker - лучший способ объединить два поля из источника данных на элемент массива имен выпадающего списка? - PullRequest
2 голосов
/ 12 марта 2019

У меня есть модель Employees со строковыми полями first_name и last_name (для примера я буду использовать John Doe). Мне бы хотелось, чтобы каждая строка раскрывающегося виджета читала «Доу, Джон», используя источник данных «Сотрудники». Я могу легко связать массив имен раскрывающегося виджета с одним или другим полем, отредактировав поле «имена» виджета:

=@datasources.Employees.item.last_name дает Доу, и =@datasources.Employees.item.first_name возвращает Джона в первом элементе раскрывающегося списка соответственно.

Конкатенация статической строки с полем также работает:

=@datasources.Employees.item.last_name + "-test" дает Doe-тест в раскрывающемся списке

Однако, когда я пытаюсь изменить эту привязку для объединения двух полей, она не работает:

=@datasources.Employees.item.last_name + ", " + @datasource.item.Employees.first_name дает только Доу

Даже выгрузка обоих полей в массив и соединение их:

=[@datasources.Employees.item.last_name, @datasources.Employees.item.first_name].join(", ") дает только Доу

Единственный способ найти значения двух разных полей из записи в одной строке в раскрывающемся виджете - использовать клиентские сценарии для заполнения массива имен виджета во время события onDataLoad:

app.datasources.Employees.load(function() {
  app.datasources.Employees.items.forEach(
    item => widget.names.push([item.last_name, item.first_name].join(", "))
  );
});

Это лучший / единственный способ сделать это, или я просто что-то упустил в диалоге привязки имен? Спасибо!

Ответы [ 2 ]

4 голосов
/ 12 марта 2019

В привязке выпадающих имен сделайте следующее:

(@datasources.Employees.items).map(function(i) { return i.last_name + ', ' + i.first_name; })

Это будет делать то, что вы хотите.

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

Причина, по которой это происходит, заключается в том, что ожидаемое значение для имен равно:

Необязательный массив меток опций, которые соответствуют 1-1 значениям опций. Это полезно, если значение, заданное в параметрах, и значение не являются строками, а вместо этого устанавливают некоторые базовые данные в бэкэнде. Например, если значение и параметры привязаны к записи, это можно использовать для отображения пользователю определенного поля записи.

Итак, первое, что нужно принять во внимание, какова привязка опций выпадающего меню? Я предполагаю, что это будет

@datasource.Employees.items.

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

@datasources.Employees.item.last_name + ", " + @datasource.item.Employees.first_name

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

Подход, который вы используете, хорош, за исключением того, что вам придется перезагружать источник данных каждый раз, когда происходят изменения. Лучший способ сделать это - следовать ответу Маркуса Малессы . Таким образом, вы предоставляете массив элементов, которые соответствуют 1-1 значениям параметра , и нет необходимости перезагружать источник данных каждый раз, когда происходят изменения.

...