Набор изменений не обновляется при обновлении раскрывающихся данных
Допустим, у меня есть данные:
data = [[key: 1, value: "1"], [key: 2, value: "2"] ,[key: 3, value: "3"]]
child_data = %{1: [key: 1, value: "exists"]}
И html:
<%= select f, :corporation_id, data %>
<%= select f, :company_id, child_data[Ecto.changeset.get_field(@changeset, :corporation_id)] %>
Моя схема и набор изменений выглядят следующим образом:
embedded_schema do
field :corporation_id, :integer
field :company_id, :integer
end
def changeset(selected_org, attrs) do
selected_org
|> cast(attrs, [:corporation_id, :company_id])
|> validate_required([:corporation_id, :company_id])
end
Проблема в следующем: когда я меняю данные
company
набор изменений не обновляется, старый идентификатор остается действующим. Насколько я понимаю, это происходит потому, что при обновлении данных не генерируется событие проверки.
Есть ли способ решения этой проблемы?
2 ответа
Хорошо, похоже, что это ограничение LiveView в настоящее время. Используя ловушку обновления в JS, я смог отправить обновление на сервер. Крюк:
Hooks.WorkaroundHook = {
updated() {
this.pushEvent("workaround", this.el.selectedIndex)
}
}
И ручка:
def handle_event("workaround", index, socket) do
# if changeset is valid and index is 0 add error to changeset
{:noreply, socket}
end
К сожалению, вы не можете добиться желаемого без JavaScript или нового LiveView от Phoenix. Поскольку ваш шаблон отправляется в браузер, единственный способ справиться с реактивностью - использовать JavaScript. В вашем случае вам нужно отправить все child_data в select:<%= select f, :company_id, child_data %>
. Затем, используя JavaScript, вы слушаете
change
событие в поле корпорации, чтобы отфильтровать значения
child_data